互斥量和执行顺序
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 *i
,printf("Inside thread %d\n", i);
是错误的。 void *
的正确格式说明符是 %p
。
【参考方案1】:
假设互斥锁是一个全局的,你会得到 2000000 条消息,每个线程有 1000000 条消息。这些顺序是随机的,但是它们不会相互干扰,因为每个打印都受到互斥锁的保护
编辑:我刚刚注意到,您是在创建下一个线程之前加入的。因此首先会有第一个线程的所有消息,然后是第二个线程的所有消息。在这种情况下,互斥锁完全没有效果。排序的原因很简单,您不会同时运行一个以上的工作线程。
【讨论】:
他们不会互相干扰是什么意思? 如果您同时从两个线程调用 printf,假设 print("AA") 和 printf("BB"),那么您可以获得输出ABAB
,因为两个线程都可以同时写入终端。这种竞争条件可以通过互斥锁来防止。但是,在您的情况下,一次只能运行一个线程(除了主线程)
pthread_join
是偶然的。我还有一个问题。迭代中的变量j
不会受到同时修改它的两个线程的影响吗?
不,因为变量在每个线程中都是本地的(每个线程都有自己的副本)。如果它是一个全局变量,那么是的,你会有一个竞争条件。
但是线程不共享相同的“内存空间”吗?还是仅适用于全局变量?对不起,如果这个问题很愚蠢,但我真的很想理解......以上是关于互斥量和执行顺序的主要内容,如果未能解决你的问题,请参考以下文章