【问题标题】:win32 api semaphores - blocked queuewin32 api 信号量 - 阻塞队列
【发布时间】:2012-01-27 14:09:49
【问题描述】:

各位程序员 :-)

有没有办法使用 win32 api 和 c++ 知道特定信号量(队列不为空)上是否有任何线程被阻塞?

提前致谢:-)

【问题讨论】:

    标签: winapi semaphore


    【解决方案1】:

    如何在超时时等待信号量?如果超时触发,立即锁定队列并检查计数。这只会提供一个粗略的指导 - 生产者可以在超时和锁定队列之间将对象排入队列,但它可能使您能够调试 P-C 队列。

    【讨论】:

    • 如何检查 win api 信号量的计数?我找不到这样的功能......我不需要它来进行调试,但我需要解决我的程序中存在的读者 - 作家问题中的饥饿问题,所以我必须检查是否有任何作家被阻止和等待...
    • 对不起,我的意思是队列数。 IIRC,ReleaseSeamphore() 可以返回以前的计数-可能有用。你遇到什么样的队列有什么问题?我没有看到 Windows 信号量有任何问题,我经常使用它们来计数/阻止生产者-消费者队列。
    • 我对信号量没有任何问题,我只需要正确同步读取器和写入器,这样就不会出现任何饥饿...所以当读取器请求读取时,他必须检查是否存在是当前正在写入的写入器,或者如果在等待队列中有写入器(被信号量阻塞),如果是这种情况,读取器必须在另一个信号量上保持阻塞......
    • 与 writer 类似...为了将该算法解释为代码,我需要一个函数来检查信号量上是否有任何阻塞(我检查是否有任何 writer 在等待的部分),所以我需要 smtg 之类的函数,它会返回信号量计数,如果它是负数,则意味着有一个作家在等待,或者像这样的 smtg...
    • 在我看来,如果您发现需要检查任何内容,您就是在错误地使用信号量。一个阻塞的、有界的生产者-消费者队列需要两个信号量和一个队列锁——这是一个绝对标准的多线程通信机制,自 Dijkstra 以来就一直存在。一个信号量“A”反映队列中对象的数量,另一个信号量“B”反映空槽的数量。读者等待'A',然后锁定队列,弹出一个对象,解锁队列并发出信号'B'。写入者等待“B”,锁定队列,推送对象,解锁队列并发出信号“A”。无需检查。
    猜你喜欢
    • 1970-01-01
    • 2014-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-27
    • 1970-01-01
    • 1970-01-01
    • 2010-10-15
    相关资源
    最近更新 更多