信号量计数

时间:2009-07-16 17:51:17

标签: .net concurrency

在.NET中,有没有办法计算信号量。我不需要线程安全计数,只需要合理的近似值,因此在GUI线程上报告状态。

目前我正在使用双计数器。真正的信号量和另一个同步递增和递减的变量,但这很烦人且容易出错。

3 个答案:

答案 0 :(得分:2)

您可以使用Interlocked.Increment和Interlocked.Decrement代替Semaphore。这将允许您轻松读取当前值,因为它是常规变量。

如果在计数达到0的情况下将它与某种Mutex结合使用,则应该完成工作。继承您选择的互斥锁或WaitHandle将为您提供一个不错的可重用组件。

请参阅Interlocked课程。

答案 1 :(得分:0)

没有。要做到这一点,你必须将(子类)Semaphore包装成带有计数器的东西。因为你不关心线程安全性,所以不会那么难。

答案 2 :(得分:0)

Process Explorer以某种方式完成它。它可能涉及深度Windows API魔法,因为它提取最大计数以及当前计数。

你也可以尝试道德等同于

int old_count=0;
if (AcquireSemaphore(timeout=0)) {
  ReleaseSemaphore(&old_count);
  old_count += 1;
}

但是有一点需要注意,它对使用信号量的代码有轻微干扰。