c++ - 为什么即使启用了 ERRORCHECK,连续 pthread_mutex_lock 也不返回 EDEADLK?
问题描述
我正在试验 pthread API 并想了解一些东西。
据我了解,以下代码应生成 EDEADLK 错误代码,但我收到未定义的错误:
mutex lock: : Undefined error: 0
void case3_error_checking_mutex()
{
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
pthread_mutex_t mtx;
pthread_mutex_init(&mtx, &attr);
pthread_mutex_lock(&mtx);
if (pthread_mutex_lock(&mtx) != 0) {
perror("mutex lock: ");
return;
}
pthread_mutex_unlock(&mtx);
}
有任何想法吗?
谢谢!
PS:我知道什么是递归互斥锁,我知道什么是死锁,我知道这是丑陋的代码等等。请不要评论这些东西。这纯粹是实验代码,让我更好地理解 pthread API 的细节。
解决方案
我发现没有设置errno。以下解决问题。
const int ret = pthread_mutex_lock(&mtx);
if (ret != 0) {
errno = ret;
perror("mutex lock: ");
return;
}
mutex lock: : Resource deadlock avoided
推荐阅读
- azure-devops - 在 vsts 发布期间更新文本文件
- netty - 令人困惑的netty IllegalAccessError 4.1.5.Final
- symfony - KnpSnappyBundle 和 Symfony 3.4:图像和/或 css 导致超时
- c# - 从选定的链接或按钮获取文本
- vb.net - 当我尝试获取另一个表单值时出错
- python - 从 MLPRegressor 对象中提取激活函数
- python - 来自mongodb收集错误的最大值(最大值) - Flask Python
- django - django rest 框架过滤器和表单上的附加字段(未存储)
- mysql - 选择只出现一次的值
- java - 将 Perl 正则表达式转换为 Java