0

我想使用 POSIX 信号量来管理从代表队列的文件中获取和放置的原子。我想要在文件系统中命名某些东西的灵活性,以便完全不相关的进程可以共享一个队列。我认为这个计划排除了 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);

受到竞争条件的影响,其中一些其他进程在该进程等待它之前发出 cond 信号。

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

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

4

4 回答 4

2

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

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

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

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

于 2008-12-13T05:13:35.830 回答
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()

于 2008-12-19T23:22:06.420 回答
0

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

于 2011-08-04T06:44:05.407 回答
-1

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

于 2008-12-10T07:48:27.217 回答