再次初始化相同的互斥锁

时间:2015-11-13 10:07:33

标签: c pthreads mutex

当我再次初始化相同的互斥变量时会有什么乐趣? 根据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;
}

提前致谢!

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()函数将返回零;否则,将返回错误编号 以指示错误。