代码之家  ›  专栏  ›  技术社区  ›  anon

如何在windows中等待/阻止信号量值达到0

  •  2
  • anon  · 技术社区  · 15 年前

    在UNIX上使用sem op()函数,可以提供sem_op=0的sembuf结构。本质上这意味着调用进程将等待/阻塞,直到信号量的值变为零。在windows中,有没有类似的方法来实现这一点?

    我试图实现的具体用例是,等到读卡器的数量达到零后,再让写卡器写入。(是的,这是一种使用信号量的有点非常规的方法;这是因为没有对读卡器数量的限制,因此没有一组受约束的资源,这是信号量通常用来管理的资源)

    UNIX SIMOP系统调用的文档可以在这里找到: http://codeidol.com/unix/advanced-programming-in-unix/Interprocess-Communication/-15.8.-Semaphores/

    4 回复  |  直到 15 年前
        1
  •  3
  •   MSN    15 年前

    假设有一个writer线程,就让writer线程吞噬信号量。即,通过 WaitForSingleObject 无论您将信号量计数初始化多少次。

        2
  •  2
  •   Anton Tykhyy    15 年前

    Windows semaphore 计数 向下 从最大值(允许的最大读卡器数)到零。 WaitXxx 函数等待非零信号量值,然后 减量 它, ReleaseSemaphore 增量 信号量(允许等待信号量的其他线程解除阻塞)。不可能以不同的方式等待windows信号量,因此在您的情况下,windows信号量可能是同步原语的错误选择。在vista/2008上您可以使用 slim read-write locks ;如果您需要支持早期版本的Windows,则必须自行运行。

        3
  •  1
  •   Tim Sylvester    15 年前

    我从未在win32 api中见过类似的函数。

    我想办法是打电话 WaitForSingleObject 或者类似的得到 WAIT_OBJECT_0 与创建信号量时指定的最大计数相同的次数。然后,您将保留所有可用的“插槽”,等待信号量的任何其他人都将阻塞。

        4
  •  1
  •   pilcrow    15 年前

    我试图实现的特定用例 就是等到读卡器的数量达到 在让一个作家写作之前归零。

    你能保证读数保持在零,直到作者全部完成吗?

    如果是这样,你可以用SysV实现等效的“等待零”行为。 manual-reset event object ,表示最后一个读卡器已完成。保持自己(同步)的“活动读卡器”计数,随着读卡器完成而递减,然后通过 SetEvent() 当计数为零时。

    如果你不能保证读者会表现良好,那么,即使是和SysV SeMS一起,你也会有一场不愉快的比赛。