当销毁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() )时会导致未定义的行为

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

相关文章

### 创建一个gRPC服务项目(grpc服务端)和一个 webapi项目(...
一、SiganlR 使用的协议类型 1.websocket即时通讯协议 2.Ser...
.Net 6 WebApi 项目 在Linux系统上 打包成Docker镜像,发布为...
一、 PD简介PowerDesigner 是一个集所有现代建模技术于一身的...
一、存储过程 存储过程就像数据库中运行的方法(函数) 优点:...
一、Ueditor的下载 1、百度编辑器下载地址:http://ueditor....