我目前正在学习麻省理工学院的开放式课程,名为《实用C语言编程》。在讨论多线程中的竞态条件时,讲义中包含了一个存在竞态条件的程序示例,并展示了如何使用互斥锁来解决该问题。该代码在Linux系统上按预期运行,但在OS X上则不然。
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
pthread_mutex_t mutex; // Added to fix race condition
unsigned int cnt = 0;
void *count(void *arg) {
int i;
for (i = 0; i < 100000000; i++) {
pthread_mutex_lock(&mutex); // Added to fix race condition
cnt++;
pthread_mutex_unlock(&mutex); // Added to fix race condition
}
return NULL;
}
int main() {
pthread_t tids[4];
int i;
for (i = 0; i < 4; i++)
pthread_create(&tids[i], NULL, count, NULL);
for (i = 0; i < 4; i++)
pthread_join(tids[i], NULL);
pthread_mutex_destroy(&mutex); // Added to fix race condition
printf("cnt = %u\n", cnt);
return 0;
}
在添加互斥锁和相应的函数调用之前,行为与预期相符,对于cnt(400000000)产生理论上正确响应的变量分数在每次运行时都不同。添加了互斥锁后,这种情况仍然存在,尽管结果明显增加,表明它具有某些预期效果,但远非完美。
我尝试在其他3台计算机/虚拟机上编译此程序:一台运行OS X 10.10(第一台运行10.11),一台带有Kali Linux(本质上是Debian Jessie),一台运行Ubuntu。两个OS X运行都显示了与描述相同的奇怪行为。然而,两个Linux系统按预期产生了完美的400000000。
所以我的问题是,为什么在OS X上互斥锁没有按预期工作?
pthread_mutex_t mutex
被初始化为零(所有全局c变量都是如此)。这与Linux平台上PTHREAD_MUTEX_INITIALIZER
的定义相匹配,但在MacOSX上则不然。 - Ctx