首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pthread-win32扩展sem_post_multiple

pthread-win32扩展sem_post_multiple
EN

Stack Overflow用户
提问于 2010-12-03 05:50:45
回答 4查看 633关注 0票数 4

我目前正在围绕pthread构建一个精简的C++包装器,以供内部使用。Windows和QNX都是以Windows为目标的,幸运的是,pthreads win32端口似乎工作得很好,而QNX符合POSIX的实际目的。

现在,在实现信号量时,我遇到了函数

代码语言:javascript
复制
sem_post_multiple(sem_t*, int)

它显然只在pthreads-win32上可用,但在QNX中缺失。顾名思义,该函数应该通过作为第二个参数给定的计数来递增信号量。据我所知,这个函数既不是POSIX 1b也不是POSIX 1c的一部分。

尽管目前没有对这个函数的要求,但我仍然想知道为什么pthreads win32提供这个函数,以及它是否有用。我可以尝试为QNX模仿它,如下所示:

代码语言:javascript
复制
sem_post_multiple_qnx(sem_t* sem, int count)
{
   for(;count > 0; --count)
   {
       sem_post(sem);
   }
} 

我所要求的是关于如何进行的建议/建议。如果大家一致建议为QNX实现这个函数,我也希望能就所建议的代码片段是否是一个可行的解决方案发表意见。

提前谢谢。

附言:为了清楚起见,我故意省略了我的花哨的C++类。对于所有建议boost来拯救的人:由于管理原因,这在我当前的项目中不是一个选项。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-12-03 06:02:23

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

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

  • 它的性能可能很差,通常在性能关键的上下文中使用sem_t
  • 此操作不是原子的。因此,在你完成循环之前,可能会发生令人困惑的事情。

我会坚持严格遵守POSIX规范。注意,sem_timedwait是信号量选项的另一个可选部分。

票数 1
EN

Stack Overflow用户

发布于 2010-12-03 06:01:52

您提出的sem_post_multiple实现不能很好地处理sem_getvalue,因为sem_post_multiple是原子递增,因此对sem_getvalue的“同时”调用不可能返回任何中间值。

就我个人而言,我想把它们都去掉:试图在一个缺乏它们的系统中添加基本的同步操作是徒劳的,你的包装器可能很快就不会再“瘦”了。因此,除非您有使用sem_post_multiple的代码,否则请不要使用它,因为您必须进行移植。

票数 1
EN

Stack Overflow用户

发布于 2010-12-03 06:01:10

sem_post_multiple()是由win32-pthread维护者引入的一个非标准助手函数。您的实现与他们的不同,因为多次递减不是原子的。这是否是一个问题取决于预期的用途。(就我个人而言,除非需要,否则我不会尝试实现此函数。)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4340332

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档