【发布时间】:2018-05-21 05:15:36
【问题描述】:
我正在从事一个爱好项目,其中互斥锁的行为很神秘。我把它归结为这个显然应该死锁的测试用例。
#include <pthread.h>
#include <stdio.h>
int main() {
pthread_mutex_t test;
pthread_mutex_init(&test, NULL);
pthread_mutex_lock(&test);
pthread_mutex_lock(&test);
printf("Took lock twice\n");
return 0;
}
但是,当我在没有-lpthread 标志的情况下进行编译时,程序不仅仍然可以编译和链接,而且还可以在没有死锁的情况下运行。为什么?
gcc pthread_break.c -o pthread_test
./pthread_test
Took lock twice
使用-lpthread 标志编译会产生预期的结果:
gcc pthread_break.c -o pthread_test -lpthread
./pthread_test
<- deadlocked here
我正在运行 GCC 版本 7.2.0。
【问题讨论】:
-
相关答案但不是重复问题。
-
您使用的是哪个平台?也许标准库包含 Pthread 函数,或者总是报告“未实现”错误的虚拟版本。您是否认真检查每个退出代码并仔细报告错误?
-
另外,也许你应该查找递归互斥锁。
标签: c multithreading gcc pthreads