我写了以下最小的例子:
#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
有人注意到,the standard显然是在说
尝试销毁被引用的锁定互斥锁或互斥锁(例如,在pthread_cond_timedwait()或pthread_cond_wait()中使用)由另一个线程导致未定义的行为。
所以可以假设,如果它相同的线程那么就可以了。
这很奇怪,因为这个句子在旧版本中被更改了它不存在而且该行仅表示
销毁已解锁的初始化互斥锁应该是安全的。试图销毁锁定的互斥锁会导致未定义的行为。
因此,认为这一改变是出于某种原因并不是那么遥远,我只是想确定一下。
我在两个不同的Linux系统(ubuntu 13.10和另一个debian 5774)上测试了前面提到的代码并且它失败并打印“无法删除:设备或资源忙#1 1”,在ideone的平台上它成功。
ideones的行为只是未定义行为的特定情况吗?或者其他案件有什么问题吗?
很遗憾,我找不到专门解决此问题的来源。
答案 0 :(得分:4)
引用文字:
尝试销毁被其他线程引用的锁定互斥锁或互斥锁(例如,在
pthread_cond_timedwait()
或pthread_cond_wait()
中使用时)会导致未定义的行为
应解释为&#34;导致未定义的行为&#34;条款分发在&#34;或&#34;连词。换句话说:
尝试销毁锁定的互斥锁会导致未定义的行为。
和
尝试销毁另一个线程引用的互斥锁(例如,在
pthread_cond_timedwait()
或pthread_cond_wait()
中使用时)会导致未定义的行为。
第二个版本很重要,因为在等待条件变量时,等待的线程会释放相关的互斥锁。