pthread_cond_destroy
对孤立的进程共享条件变量的行为是指定的,未指定的,实现定义的还是未定义的?另外,我在Linux上看到的行为(下面将详细说明)是一个错误吗?
这里的“孤儿”简称我指的是服务员去世时pthread_cond_wait
电话中的一个。
调整this question的方案,我发现如果我在Linux上这样做:
Time Process A Process B Comments
---- --------- --------- --------
1 mmap MAP_ANONYMOUS // or shm_open()
2 init pshared cv
3 init pshared mutex
4 fork ------------------> lock(mutex) // can also re-shm_open()
5 wait... alarm(a_timeout)
6 wait... cond_wait(cv, mutex)
7 wait <------------------ <<ALRM>>
8 cond_signal(cv) // (without this, EBUSY for #9)
9 cond_destroy(cv) // blocks on linux
在Linux上,destroy()(#9)永远阻止。如果我省略了孤儿cv的信号(#8),那么Linux destroy()将返回EBUSY。相反,在OS X上,无论信号与否,destroy()始终返回EBUSY。
对于它的价值,我不在Linux上使用进程共享的互斥锁和cvs在单个多线程进程中看到这种行为(等待线程取消()d)。
再一次,什么是规格和什么是错误?
答案 0 :(得分:1)
根据spec for pthread_cond_destroy
“销毁初始化条件变量应该是安全的 当前没有线程被阻止“
由于情况确实如此,即在条件变量上没有任何引用或阻塞的其他线程,销毁应该成功。
恕我直言,我们在两个操作系统中都存在错误,因为条件变量对象处于不一致状态。