微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

当销毁locking的互斥体时,pthread_mutex_destroy的正确行为是什么?

我写了以下最简单的例子:

#include <iostream> #include <cstring> #include <pthread.h> #define SUCCESS 0 using namespace std; int main() { int res; pthread_mutex_t t; pthread_mutex_init(&t,NULL); res = pthread_mutex_lock(&t); res = pthread_mutex_destroy(&t); if (res != SUCCESS) { cout << "Failed to delete: " << strerror(res) << " # " << t.__data.__lock << " " << t.__data.__nusers << endl; } else { cout << "Deleted!"<< endl; } res = pthread_mutex_unlock(&t); cout << res << endl; pthread_exit(NULL); return 0; }

也在ideone

有人指出, 标准显然是这样说的

尝试销毁一个被locking的互斥体或被另一个线程引用的互斥体(例如,在pthread_cond_timedwait()或pthread_cond_wait()中使用)会导致未定义的行为。

获取'm_Mutex'声明为引用,但没有初始化错误

为什么WaitForSingleObject会返回WAIT_Failed

信号量信号与互斥

我们是否确实需要与“PTHREAD_MUTEX_ROBUST”相反的属性“PTHREAD_MUTEX_STALLED”的互斥锁?

如何在一个线程上花费比互斥体更长的时间?

所以人们可以假设,如果它是相同的线程,那么它是可以的。

这很奇怪,因为这个句子在旧版本中已经改变了,它不在那里,只有这句话

销毁已解锁的已初始化的互斥锁应是安全的。 尝试销毁locking的互斥锁会导致未定义的行为。

所以,认为这个改变是有原因的,我只是想确定一下。

我在两个不同的linux系统(ubuntu 13.10和另一个debian 5774)上testing了前面提到的代码,并且失败并打印出“无法删除:设备或资源繁忙#1”,在ideone的平台上它成功。

意甲人的行为只是一个未定义行为的具体案例吗? 或者其他情况有什么问题吗?

不幸的是,我找不到具体解决这个问题的来源。

什么是非阻塞信号量?

一个用户崩溃时共享内存互斥?

如何在Linux和C中使用文件作为互斥?

Windows互斥对象和信号量

指针variables是否需要互斥锁?

引用的文字

尝试销毁一个被锁定的互斥体或被另一个线程引用的互斥体(例如,在pthread_cond_timedwait()或pthread_cond_wait() )会导致未定义的行为

应该用“结果在未定义的行为”条款解释与“或”联合。 换一种说法:

尝试销毁锁定的互斥锁会导致未定义的行为

试图销毁一个被引用的互斥体(例如,当在另一个线程的pthread_cond_timedwait()或pthread_cond_wait() )时会导致未定义的行为

第二个版本是重要的,因为当等待条件变量时,等待线程释放关联的互斥锁。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐