Lam*_*ang 5 c multithreading gcc pthreads
我正在做一个互动项目,其中互斥体表现得很神秘.我把它归结为这个应该明显陷入僵局的测试用例.
#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版.
小智 2
这个问题似乎缺乏信息 - 但似乎有两个选择:
首先,启动互斥锁PTHREAD_MUTEX_RECURSIVE
,这将允许对互斥锁进行双重锁定 - 管理引用计数,并且仅当引用计数为 0 时才释放互斥锁。这意味着可以在同一线程中多次锁定同一个互斥锁,但为了释放它,必须提供相同数量的解锁。
第二,这个版本中的 gcc 仅实现了函数的存根pthread
- 这意味着如果您不添加-lpthread
库链接指令,则不会实现锁定函数。添加该选项后,会出现死锁,这一事实证明了这一点。
我将尝试检查 GCC 源代码,以验证这确实是第二个选项的结果 - 将添加更新。
注意:始终建议专门链接库,因为它允许控制结果 - GCC 内部支持的回退可能会导致意外行为,如上所示。
归档时间: |
|
查看次数: |
603 次 |
最近记录: |