我正在做一个业余项目,其中互斥锁的行为很神秘。我将其简化为这个测试案例,应该会明显地死锁。
#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。