SemaphoreSlim(1) 如何知道其他线程是否正在等待

ila*_*sch 2 c# multithreading synchronization semaphore

为了同步,我创建了一个 SemaphoreSlim(1)。
这意味着如果我的班级中有这个信号量的单个实例作为锁:

private SemaphoreSlim _initializationSemaphore = new SemaphoreSlim(1);
private bool _isInitialized = false;    

public void Initialize()
{
  await _initializationSemaphore.WaitAsync();
  if (_isInitialized)
  {
     _logger.Warn("SDK is already initialized");
  }
  //Do some logic only once and only ..
  _isInitialized=true;
  _initializationSemaphore.Release();
}
Run Code Online (Sandbox Code Playgroud)

第一个进入函数的线程将继续运行代码,其他线程将无法进入函数,直到第一个线程释放信号量。
我的问题是 - 我怎么知道当前有多少线程卡在:

await _initializationSemaphore.WaitAsync();
Run Code Online (Sandbox Code Playgroud)

谢谢。

Bra*_*Rem 5

对于快速而肮脏的事情,只保留一个保存计数的静态变量怎么样?

private SemaphoreSlim _initializationSemaphore = new SemaphoreSlim(1);
private bool _isInitialized = false;    
private static int _waitingThreads = 0;    

public void Initialize()
{
  try
  {
      Interlocked.Increment(ref _waitingThreads);
      await _initializationSemaphore.WaitAsync();
  }
  finally
  {
      Interlocked.Decrement(ref _waitingThreads);
  }
  if (_isInitialized)
  {
     _logger.Warn("SDK is already initialized");
  }
  //Do some logic only once and only ..
  _isInitialized=true;
  _initializationSemaphore.Release();
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你想使用它,你需要同步对 `_waitingThreads` 的访问。我建议你使用 `Interlocked.Increment(ref _waitingThreads);` 和 `Interlocked.Decrement(ref _waitingThreads);`。否则,两个线程同时进入 `Initialize` 方法会导致 `_waitingThreads` 只增加一次。 (2认同)