C pthread互斥锁工作不正常

C pthread互斥锁工作不正常,c,multithreading,pthreads,mutex,C,Multithreading,Pthreads,Mutex,我目前正在从麻省理工学院的开放式课程“C语言中的实用编程”中学习C语言。在讨论多线程中的竞争条件时,课堂讲稿中包含了一个具有竞争条件的程序示例,以及如何使用互斥来解决它。该代码在linux系统上按预期工作,但在OSX上不工作 #include <stdio.h> #include <stdlib.h> #include <pthread.h> pthread_mutex_t mutex; // Added to fix race condition unsi

我目前正在从麻省理工学院的开放式课程“C语言中的实用编程”中学习C语言。在讨论多线程中的竞争条件时,课堂讲稿中包含了一个具有竞争条件的程序示例,以及如何使用互斥来解决它。该代码在linux系统上按预期工作,但在OSX上不工作

#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;
}
#包括
#包括
#包括
pthread_mutex_t mutex;//添加到修复竞态条件
无符号整数cnt=0;
无效*计数(无效*参数){
int i;
对于(i=0;i<100000000;i++){
pthread_mutex_lock(&mutex);//添加到修复争用条件
cnt++;
pthread_mutex_unlock(&mutex);//添加到修复争用条件
}
返回NULL;
}
int main(){
pthread_t tids[4];
int i;
对于(i=0;i<4;i++)
pthread_create(&tids[i],NULL,count,NULL);
对于(i=0;i<4;i++)
pthread_join(tids[i],NULL);
pthread_mutex_destroy(&mutex);//添加到修复争用条件
printf(“cnt=%u\n”,cnt);
返回0;
}
在添加互斥体和相应的函数调用之前,该行为与预期一样,为cnt(400000000)生成了理想正确响应的可变部分,每次运行都不同。在添加互斥锁后,这种情况仍在发生,尽管结果明显增加,这表明它有一些预期的效果,但还远远不够完美

我试着在另外3台计算机/虚拟机上编译这个程序:一台运行OSX10.10(第一台运行10.11),一台使用Kali Linux(基本上是Debian Jessie),另一台运行Ubuntu。两次OSX运行都显示了与上述相同的奇怪行为。然而,两个Linux系统都像预期的那样产生了完美的400000000


所以我的问题是,为什么互斥在OS X上不能像预期的那样工作?

您没有初始化互斥。您可以这样做:

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
或者在
main
功能中,执行以下操作:

if ( pthread_mutex_init( &mutex, NULL) != 0 )
    printf( "mutex init failed\n" );

它与linux一起工作的原因是,在linux下:

#define PTHREAD_MUTEX_INITIALIZER { { 0, 0, 0, 0, 0, { 0 } } }
这正是互斥体的初始化方式,因为它是一个.bss变量

在MacOSX下,它还有一些神奇的价值:

#define PTHREAD_MUTEX_INITIALIZER {_PTHREAD_MUTEX_SIG_init, {0}}
#define _PTHREAD_MUTEX_SIG_init     0x32AAABA7

所以它确实需要初始化才能正常工作。

我注意到在头文件中出现了这种情况,我想知道这种差异是否意味着什么。然而,现在似乎很奇怪的问题是,它在Linux上给出了正确的结果,没有初始化它,只是声明了它。@psytech140我试图在上面解释:
pthread\u mutex\u t mutex
是用零初始化的(所有全局c变量都是零)。这与linux平台上的
PTHREAD\u MUTEX\u初始值设定项的定义相匹配,但与MacOSX上的定义不匹配。@salthehash它“给出了正确的结果”是什么意思?!使用未初始化的互斥锁的“正确结果”是什么?我不知道。你…吗?