2010-05-02 50 views

回答

4

如果你想要这个值用于外部监测(如你在你的评论中所建议的那样),那么在致电ReleaseSemaphore()或者恕我直言之后,要么使用先前的值,更好的解决方案是除了信号量之外,还要实现自己的“互锁”计数器;那么你有你的监控计数,可以在你喜欢的任何方式访问它......只要不使用它,如果你可以“进入”的信号看到的一种方式......

正如克里斯说得好,你无法获得当前计数,因为它可能会一直在变化。

+0

如果在访问信号量之前用实际锁定替换包装的互锁解决方案,则可以使用计数,只要您喜欢。 – chacham15 2014-01-11 19:07:55

2

有没有这样的东西作为一个Win32信号的“当前计数” - 这就是为什么你不能得到它。

我的意思是,在某个时刻,信号量的计数将会是一些值,但是从线程的角度来看,除非它采取措施来增加或减少信号计数,否则另一个线程可能会任何答案检索完全无效的时刻计算。

正是出于这个原因,Windows API的同步功能,不要让你把以前的锁计数无副作用。副作用保证您有一个有效的机会窗口,以有意义的方式实际使用该值。


明显的 “解决办法” 将做类似

LONG count = 0; 
if(WAIT_OBJECT_0 == WaitForSingleObject(hSemaphore,0L)) 
{ 
    // Semaphores count is at least one. 
    ReleaseSemaphore(hSemaphore,1,&count); 
} 

这是为什么好?我不确定。但是如果ReleaseSemaphore被允许释放0,那么或许在等待和释放之间做一些有意义的事情是可能的。

+3

这种能力对于外部监测很有用(例如,生产者和消费者的信号量计数表示仍待处理的对象的数量)。 因此,我很惊讶,它是可撤销的。 – 2010-05-02 19:34:47

+0

解决方法的问题是它可能会歪曲实际使用信号量;您可能会将等待引入正在使用信号量用于预期目的的线程。引入的等待会很小,但可能足以导致上下文切换。最好只保留自己的监测计数器。 – 2010-05-03 19:51:59

2

Sysinternals的工具进程浏览器可以显示的win32手柄,包括信号量和它们的当前/最大计数的内部结构。对于调试而言足够好,但对自动化监控不太有用。

如果进程资源管理器可以做到这一点,你可能太...但它可能会需要Windows内部的深入了解。

4

这可能有点为时已晚,但我认为NtQuerySemaphore()可能是你想看看是什么。

+0

https://stackoverflow.com/questions/2579536/semaphores-values – 2017-09-15 15:17:35

相关问题