C 再次初始化同一互斥锁

C 再次初始化同一互斥锁,c,pthreads,mutex,C,Pthreads,Mutex,当我再次初始化同一互斥变量时会发生什么? 根据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");

当我再次初始化同一互斥变量时会发生什么? 根据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;
}

提前谢谢

注意,它说pthread_mutex_init函数可能会失败,如果。。。。这意味着不需要实现来执行这些检查,显然您的实现也不需要

请查看的错误列表:

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

[伊根] 除了内存之外,系统缺少初始化另一个互斥锁所需的资源

[依诺曼] 内存不足,无法初始化互斥锁

[EPERM] 调用方没有执行该操作的权限

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

[EBUSY] 该实现检测到有人试图重新初始化互斥体引用的对象,该互斥体是以前初始化但尚未销毁的互斥体

[艾因瓦尔] attr指定的值无效

您会注意到[EBUSY]位于maybeail部分。因此,它不是一种保证,而只是一个实现可以做的事情

对于那些不习惯阅读标准或正式API文档的人来说,这类事情往往有点令人惊讶。措辞的选择是经过深思熟虑的,这个词通常表示允许发生的事情。“将”或“应”一词通常用于表示担保

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

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


注意,它说pthread_mutex_init函数可能会失败,如果。。。。这意味着不需要实现来执行这些检查,显然您的实现也不需要

请查看的错误列表:

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

[伊根] 除了内存之外,系统缺少初始化另一个互斥锁所需的资源

[依诺曼] 内存不足,无法初始化互斥锁

[EPERM] 调用方没有执行该操作的权限

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

[EBUSY] 该实现检测到有人试图重新初始化互斥体引用的对象,该互斥体是以前初始化但尚未销毁的互斥体

[艾因瓦尔] attr指定的值无效

您会注意到[EBUSY]位于maybeail部分。因此,它不是一种保证,而只是一个实现可以做的事情

对于那些不习惯阅读标准或正式API文档的人来说,这类事情往往有点令人惊讶。措辞的选择是经过深思熟虑的,这个词通常表示允许发生的事情。“将”或“应”一词通常用于表示担保

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

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


你为什么要这样做?我只是想模拟一个在集成系统中得到EBUSY的情况。你为什么要这样做?我只是想模拟一个在集成系统中得到EBUSY的情况。