互斥量和执行顺序

Posted

技术标签:

【中文标题】互斥量和执行顺序【英文标题】:Mutex and order of execution 【发布时间】:2022-01-08 07:01:08 【问题描述】:

首先,我对 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 中的第一个吗?还是因为秩序更加混乱?

【问题讨论】:

鉴于void *iprintf("Inside thread %d\n", i); 是错误的。 void * 的正确格式说明符是 %p 【参考方案1】:

假设互斥锁是一个全局的,你会得到 2000000 条消息,每个线程有 1000000 条消息。这些顺序是随机的,但是它们不会相互干扰,因为每个打印都受到互斥锁的保护

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

【讨论】:

他们不会互相干扰是什么意思? 如果您同时从两个线程调用 printf,假设 print("AA") 和 printf("BB"),那么您可以获得输出 ABAB,因为两个线程都可以同时写入终端。这种竞争条件可以通过互斥锁来防止。但是,在您的情况下,一次只能运行一个线程(除了主线程) pthread_join 是偶然的。我还有一个问题。迭代中的变量j不会受到同时修改它的两个线程的影响吗? 不,因为变量在每个线程中都是本地的(每个线程都有自己的副本)。如果它是一个全局变量,那么是的,你会有一个竞争条件。 但是线程不共享相同的“内存空间”吗?还是仅适用于全局变量?对不起,如果这个问题很愚蠢,但我真的很想理解......

以上是关于互斥量和执行顺序的主要内容,如果未能解决你的问题,请参考以下文章

:同步与互斥

线程资源同步——互斥量和条件变量

进程同步进程互斥

如何让线程按特定顺序执行?

《重要》内核下各种同步处理方法(自旋锁信号灯互斥体…)

操作系统学习---进程管理