【发布时间】:2017-04-22 01:09:51
【问题描述】:
我试图创建 2 个线程并调用相同的函数,该函数从 for 循环中增加一个计数器“计数”。但是每次我运行这段代码时,计数器的值都是不同的。当线程增加全局静态变量“count”但值仍然不同时,我尝试使用互斥锁在线程之间进行同步。
static int count;
pthread_mutex_t count_mutex;
void increment()
{
pthread_mutex_lock(&count_mutex);
count++;
pthread_mutex_unlock(&count_mutex);
}
void *myThreadFun1(void *var)
{
printf("Thread1\n");
for(int i=0; i< 10000;i++)
{
increment();
}
return;
}
int main()
{
pthread_t tid1;
pthread_t tid2;
pthread_create(&tid1, NULL, myThreadFun1, NULL);
// sleep(1);
pthread_create(&tid2, NULL, myThreadFun1, NULL);
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
printf("\n%d",count);
exit(0);
}
如果我不在线程之间休眠,输出永远不会是 20000。
在java中我们可以使用“synchronized”关键字,但是如何在C中实现呢?
【问题讨论】:
-
pthread_mutex_t 使用前需要初始化。
-
是的,我将它初始化为 PTHREAD_MUTEX_INITIALIZER,现在输出是我所期望的。谢谢。
-
@gaurav 更新代码的工作版本。
-
@gaurav:标准要求在使用前对互斥锁进行 init,但是对于文件静态或全局,默认的 0 init 恰好可以工作(当然不建议依赖这个)。出于好奇,您使用的是什么操作系统/CPU?
-
@ErikAlapää 是的,我错过了初始化互斥锁。我在 macOS 上。
标签: c multithreading pthreads mutex thread-synchronization