是否可以避免仅使用POSIX信号量的唤醒等待比赛?它是良性的吗?

时间:2008-12-10 03:48:34

标签: queue posix atomic semaphore race-condition

我想使用POSIX信号量来管理表示队列的文件中的原子get和put。我希望在文件系统中具有命名的灵活性,以便完全不相关的进程可以共享队列。我认为这个计划排除了pthreads。命名的posix信号量非常适合在任何进程可以看到的文件系统中放置一些内容,但我找不到标准的CondWait原语:

... decide we have to wait ....
CondWait(sem, cond);

当一个进程调用CondWait时,它会原子地发布到sem并等待cond。当其他一些进程发布到cond时,等待进程只有在它可以原子地减少sem时才会被唤醒。

的替代方案
... decide we have to wait ....
sem_post(sem);
sem_wait(cond);
sem_wait(sem);

受到竞争条件的影响,其中一些其他过程信号在此过程等待之前就会消失。

我几乎没有做任何并发编程,所以我想我会问:如果我使用标准POSIX计数信号量作为条件变量,那么这场比赛是否可能是良性的?

为了防止任何人想要更大的上下文,我正在为可以从shell脚本调用的原子队列构建get和put操作。

4 个答案:

答案 0 :(得分:2)

由于没有其他答案,我会跟进我所学到的内容:

  • Pthreads不适用于我的应用程序,因为我有一个没有共同祖先的进程需要共享一个原子队列。
  • Posix信号量 受制于等待唤醒的比赛,但由于与经典条件变量不同,它们正在计算信号量,因此比赛是良性的。我没有这个说法的证据,但我现在有一个系统运行了两天并且运行良好。 (我完全没意义,但至少这意味着我完成了工作。)
  • 命名的Posix信号量难以从文件系统中进行垃圾收集

总而言之,名为Posix的信号量被证明是实现原子队列抽象的一个良好的基础,可以在不相关的进程之间共享

我想要一个证明或经过验证的SPIN模型,但由于我对应用程序的需求有限,我似乎不太可能写一个。我希望这可以帮助其他可能想要使用Posix信号量的人。

答案 1 :(得分:0)

根据POSIX标准,信号量例程集是:

  • sem_close()
  • sem_destroy()
  • sem_getvalue()
  • sem_init()
  • sem_open()
  • sem_post()
  • sem_timedwait()
  • sem_trywait()在
  • sem_unlink()
  • sem_wait()

sem_trywait()sem_timedwait()函数可能正是您要找的。

答案 2 :(得分:0)

我知道这个问题很老,但显而易见的解决办法就是只使用位于文件中的进程共享互斥锁和条件变量mmap

答案 3 :(得分:-1)

您正在寻找:pthread_cond_wait,pthread_cond_signal,我想 如果你使用posix线程,那么pthread方法将提供CondWait和Signal的功能。
在这里查看通过共享内存在多​​进程pthread上的源代码 http://linux.die.net/man/3/pthread_mutexattr_init
这是针对Linux的,但文档是posix。它们与Solaris类似,但您需要仔细阅读操作系统上的手册页。

免费获取贴纸的机会↓↓↓
豫ICP备18024241号-1