Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Winapi 有没有办法找出win32信号量的当前计数?_Winapi_Semaphore - Fatal编程技术网

Winapi 有没有办法找出win32信号量的当前计数?

Winapi 有没有办法找出win32信号量的当前计数?,winapi,semaphore,Winapi,Semaphore,我正在寻找一种没有副作用的方法 理想情况下,以下代码可以实现此目的: long currentCount = 0; ::ReleaseSemaphore(h, 0, &currentCount); 但不幸的是,不允许0作为lReleaseCount的值,因此调用返回FALSE 没有Win32信号量的“当前计数”这样的东西-这就是为什么您无法获取它 我的意思是,很明显,在某个时间点,信号量的计数将是某个值,但从线程的角度来看,除非它采取措施增加或减少信号量计数,否则另一个线程可能

我正在寻找一种没有副作用的方法

理想情况下,以下代码可以实现此目的:

long currentCount = 0;  
::ReleaseSemaphore(h, 0, &currentCount);  

但不幸的是,不允许0作为lReleaseCount的值,因此调用返回FALSE

没有Win32信号量的“当前计数”这样的东西-这就是为什么您无法获取它

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

正是由于这个原因,windows api同步函数不允许您在没有副作用的情况下进行上一次锁计数。副作用保证了您有一个有效的机会以有意义的方式实际使用该值


显而易见的“变通办法”是做如下事情

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

为什么这样更好?我不确定。但也许在等待和释放之间有可能做一些有意义的事情,如果允许释放信号量释放0,这将是一种竞争条件

如果您希望将该值用于外部监控(如您在评论中所建议的),则可以在调用
ReleaseSemaphore()
后使用上一个值,或者更好的解决方案是在信号量之外实现自己的“联锁”计数器;然后你有了你的监控计数,你可以用任何你喜欢的方式访问它。。。只是不要用它来判断你是否可以“输入”信号量


正如Chris正确地说的,您无法获得当前计数,因为它可能一直在变化。

系统内部工具Process Explorer可以显示win32句柄的内部,包括信号量及其当前/最大计数。对于调试来说已经足够好了,但是对于自动监控来说却没那么有用


如果Process Explorer可以做到这一点,您可能也可以。。。但它可能需要对windows内部结构有深入的了解。

这可能有点晚了,但我认为NtQuerySemaphore()可能是您想要了解的内容。

这种能力对于外部监控非常有用(例如生产者和消费者),其中信号量的计数表示仍挂起的对象数)。因此,我很惊讶它是可撤销的;您可能会将等待引入到为预期目的使用信号量的线程中。引入的等待很小,但可能足以导致上下文切换。最好只维护自己的监控计数器。如果在访问信号量之前用实际锁替换包装器的联锁解决方案,则可以随意使用计数。