我目前正在围绕Pthreads构建一个薄薄的C ++包装器,以供内部使用。窗口和QNX都是针对性的,幸运的是,Pthreads-win32端口似乎很好地工作,而QNX则符合POSIX的实际目的。

现在,在实现信号量时,我点击了功能

sem_post_multiple(sem_t*, int)

显然仅在pthreads-win32上可用,但QNX缺少。顾名思义,该函数应该通过给出的第二个参数来增加信号量。据我所知,该功能不是POSIX 1B或POSIX 1C的一部分。

尽管目前没有上述功能的要求,但我仍然想知道为什么Pthreads-win32提供该功能以及是否可以使用。我可以尝试使用与以下几个类似的方式模仿QNX:

sem_post_multiple_qnx(sem_t* sem, int count)
{
   for(;count > 0; --count)
   {
       sem_post(sem);
   }
} 

我要求的是有关如何进行的建议/建议。如果共识建议确实为QNX实施功能,我还将感谢您对建议的代码是否是可行的解决方案的评论。

提前致谢。

PS:我故意省略了我的花哨的C ++课程,以确保清晰。对于所有建议促进救援的人:由于管理原因,这不是我当前项目中的选择。

有帮助吗?

解决方案

在任何情况下,信号量都是POSIX中的可选扩展。例如OS X似乎并未完全实现它们。因此,如果您关心可移植性,则必须提供所需功能的包装器。

您通过迭代模仿原子增量的方法 sem_post 肯定有缺点。

  • 它可能表现不佳,通常 sem_t 用于绩效关键环境。
  • 此操作不会是原子。因此,在完成循环之前,可能会发生混乱的事情。

我会坚持正义的,严格的posix符合。当心 sem_timedwait 是信号量选项的另一个可选部分。

其他提示

您提出的实施 sem_post_multiple 玩得不好 sem_getvalue, , 自从 sem_post_multiple 是原子量的增长,因此“同时”呼吁不可能 sem_getvalue 返回任何中间值。

就我个人而言,我想将他们置于:尝试将基本同步操作添加到缺少它们的系统中是杯子的游戏,而您的包装器可能很快就会“稀薄”。因此,除非您有使用的代码,否则不要进入 sem_post_multiple, ,您绝对必须端口。

SEM_POST_MULTIPER()是由Win32-PTHREADS MAINTER引入的非标准辅助功能。您的实现与他们的实现不同,因为多重减少不是原子。这是否是问题取决于预期的用途。 (就个人而言,除非/直到需要,否则我不会尝试实现此功能。)

这是个有趣的问题。 +1。

我同意当前的普遍共识,即实施该功能可能不是一个好主意。尽管在大多数情况下,您提出的实施可能会很好地工作,但由于非原子性,结果肯定会有很大的不同。以下是一个(极其)人为的情况:

  • 启动线程A,该线程a调用sem_post_multiple(s,10)
  • 线程B等待S发布。线B杀死线程A。

在上述不友好的方案中,原子版本会将信号量递增10。对于非原子版本,它只能增加一次。这个例子当然不太可能在现实世界中。例如,杀死线程几乎总是一个坏主意。 WIN32实施可能会在信号量上留下一个静音锁 - 看到为什么.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top