我写了以下最简单的例子:
#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()中使用)会导致未定义的行为。
为什么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() )时会导致未定义的行为 。
第二个版本是重要的,因为当等待条件变量时,等待线程释放关联的互斥锁。