销毁孤立的进程共享条件变量

时间:2013-12-13 17:46:13

标签: pthreads posix shared-memory

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)。

再一次,什么是规格和什么是错误?

1 个答案:

答案 0 :(得分:1)

根据spec for pthread_cond_destroy

  

“销毁初始化条件变量应该是安全的   当前没有线程被阻止“

由于情况确实如此,即在条件变量上没有任何引用或阻塞的其他线程,销毁应该成功。

恕我直言,我们在两个操作系统中都存在错误,因为条件变量对象处于不一致状态。