当我再次初始化相同的互斥变量时会有什么乐趣? 根据pthread_mutex_init()手册页 - http://linux.die.net/man/3/pthread_mutex_init
它应该以errno设置为EBUSY
失败为什么我看不到这种行为?下面的代码执行得很好。
lock = (pthread_mutex_t *)malloc(sizeof(pthread_mutex_t));
if (pthread_mutex_init((pthread_mutex_t*)lock, NULL) != 0)
{
printf("\n mutex init failed\n");
return 1;
}
if (pthread_mutex_init((pthread_mutex_t*)lock, NULL) != 0)
{
printf("\n mutex init failed %d\n", errno);
return 1;
}
提前致谢!
答案 0 :(得分:5)
请注意,如果......“pthread_mutex_init()函数可能失败”。这意味着执行这些检查不需要实现,显然你的实现不是。
查看corresponding POSIX page的错误列表:
如果出现以下情况,pthread_mutex_init()函数将失败:
[EAGAIN] 系统缺少必要的资源(除了内存)来初始化另一个互斥锁。
[ENOMEM] 内存不足,无法初始化互斥锁。
[EPERM] 调用者没有执行操作的权限。
如果出现以下情况,pthread_mutex_init()函数可能失败:
[EBUSY] 该实现已检测到尝试重新初始化由互斥锁引用的对象,互斥锁是先前已初始化但尚未销毁的互斥锁。
[EINVAL] attr指定的值无效。
您会注意到[EBUSY]
位于“可能失败”部分。所以它不是保证,而只是允许实现的东西。
对于那些不习惯阅读标准或正式API文档的人来说,这种事情往往有点令人惊讶。措辞的选择是刻意的,“可能”一词通常表示允许发生的事情。 “将”(或不太常见的“应该”)一词用于表示保证。
此外,pthread_mutex_init
实际上会返回错误代码,如果有错误代码,则不会设置errno
。在您引用的手册页中:
如果成功,pthread_mutex_destroy()和pthread_mutex_init()函数将返回零;否则,将返回错误编号 以指示错误。