互斥锁和执行顺序

Mutex and order of execution

首先,我对 posix 编程还很陌生,仍然理解基本概念。我还是不太清楚怎么做 pthread_mutex_lock pthread_mutex_unlock 工作。

#include <unistd.h>
#include <errno.h>
#include <stdlib.h>
#include <pthread.h>
#inlcude <stdio.h>
pthread_mutex_t_mtx;
void* routine(void* i){
    int j;
    for(j = 0; j < 1000000; ++j){
         pthread_mutex_lock(&mtx);
         printf("Inside thread %d\n", i);
         pthread_mutex_unlock(&mtx);
    }
    return NULL;
}

int main()
{
   pthread_t th[3];
   int i;
   pthread_mutex_init(&mtx, NULL);
   for(i = 1; i <= 2; ++i)
   {
      if(pthread_create(th + i, NULL, routine, i){
           perror(NULL);  return 1;
      }
   }

   for(i = 1; i <=2; ++i)
        pthread_join(th[i], NULL);

   return 0;
}

以上程序的正确输出应该是什么?我认为由于互斥锁的锁定和解锁,会有 2000000 次迭代,但我不太清楚它们的完成顺序。第一个线程是否执行 for 的前 1000000 步?它甚至执行 20000000 中的第一个吗?还是更混乱的秩序造成的?

假设互斥量是全局互斥量,您将收到 2000000 条消息,每个线程 1000000 条。它们的顺序是随机的,但是它们不会相互干扰,因为每个打印件都受到互斥锁

的保护

编辑:我刚刚注意到,您在创建下一个线程之前加入。因此首先会有第一个线程的所有消息,然后是第二个线程的所有消息。在这种情况下,互斥锁根本不起作用。排序的原因很简单,您不会同时拥有一个以上的工作线程运行。