#include <pthread.h>
#include <iostream>
int main()
{
pthread_mutex_t mtx;
pthread_mutex_init(&mtx, NULL);
pthread_mutex_lock(&mtx);
pthread_mutex_lock(&mtx);
return 0;
}
我在Centos 7中运行这段代码,我希望有一个核心转储文件,但它没有,程序只是在命令行中死亡。
我认为pthread互斥锁是默认的非递归互斥锁,在我的程序中只有一个线程,所以当我锁定这个互斥锁两次时,它应该是粉碎的。
当出现问题时,不能保证有核心转储。有一些错误,比如解引用一个空指针,linux选择捕获它并为您提供一个核心转储文件(在正确的模式下),但是不能保证。实际上,许多逻辑错误无法被检测到,因此无法确定是否需要转储。
在互斥锁两次的情况下,这是"未定义行为"。这意味着库提供没有保证会发生什么。在互斥锁的特殊情况下,可以深入了解特定的实现如何处理它。
然而,一般来说,值得注意的是pthreads中有一个可重入互斥锁,它的唯一工作是在线程将互斥锁两次时提供相同的行为。考虑到pthreads开发人员认为需要同时提供可重入和不可重入互斥锁,这表明可以对互斥锁进行一些优化,这些优化只有在线程不锁定互斥锁两次时才安全。
在这种情况下,看起来您的库可能使用了不知道哪个线程执行锁定的锁定方案。因此,当您第二次锁定它时,它不会意识到该线程已经锁定了它,而是平静地等待该线程自己解锁。
如果您试图在一个线程上锁定互斥锁,而在另一个线程上解锁它,则会出现一组相关的奇怪行为(如果您需要这种行为,请使用信号量)