我正在做一个互动项目,其中互斥体表现得很神秘.我把它归结为这个应该明显陷入僵局的测试用例.
#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;
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在没有-lpthread标志的情况下编译时,程序不仅仍然可以编译和链接,它也可以在没有死锁的情况下运行.为什么?
gcc pthread_break.c -o pthread_test
./pthread_test
Took lock twice
Run Code Online (Sandbox Code Playgroud)
使用该-lpthread标志进行编译会产生预期结果:
gcc pthread_break.c -o pthread_test -lpthread
./pthread_test
<- deadlocked here
Run Code Online (Sandbox Code Playgroud)
我正在运行GCC 7.2.0版.