为什么没有lpthread标志的gcc链接?
我正在做一个互动项目,其中互斥体表现得很神秘。 我把它归结为这个应该明显陷入僵局的测试用例。
#include #include 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_MUTEX_RECURSIVE
启动互斥锁,这将允许对互斥锁进行双重锁定 – 管理引用计数,并且仅当引用计数为0时才释放互斥锁。这意味着可以在同一个线程中多次锁定相同的互斥锁,但为了释放它,必须提供相同数量的解锁。
第二个是,此版本中的gcc仅为pthread
函数实现存根 – 这意味着如果不添加-lpthread
库链接指令,则不会实现锁定函数。 这一点得到以下事实的支持:添加选项后,会出现死锁。
我将尝试通过GCC源validation这确实是第二个选项的结果 – 将添加更新。
注意:始终建议专门链接库,因为它允许控制结果 – GCC内部支持的回退可能导致意外行为,如上所示。