再次初始化相同的互斥锁

Cod*_*der 1 c mutex pthreads

当我再次初始化相同的互斥变量时会有什么好处?根据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;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

Dav*_*rtz 5

请注意,如果......" pthread_mutex_init()函数可能会失败".这意味着执行这些检查不需要实现,显然你的实现不行.

看一下相应的POSIX页面的错误列表:

如果出现以下情况,pthread_mutex_init()函数失败:

[EAGAIN]系统缺少必要的资源(除了内存)来初始化另一个互斥锁.

[ENOMEM]存在内存不足以初始化互斥锁.

[EPERM]调用者没有执行操作的权限.

如果出现以下情况,pthread_mutex_init()函数可能会失败:

[EBUSY]该实现已检测到尝试重新初始化由互斥锁引用的对象,互斥锁是先前已初始化但尚未销毁的互斥锁.

[EINVAL] attr指定的值无效.

您会注意到[EBUSY]"可能失败"部分.所以它不是保证,而只是允许实现的东西.

对于那些不习惯阅读标准或正式API文档的人来说,这种事情往往有点令人惊讶.措辞的选择是刻意的,"可能"一词通常表示允许发生的事情."将"(或不太常见的"应该")一词用于表示保证.

另外,pthread_mutex_init实际上返回错误代码,如果有,则不设置errno.从您引用的手册页:

如果成功,pthread_mutex_destroy()和pthread_mutex_init()函数将返回零; 否则,应返回错误编号以指示错误.