在 C# 中线程化时锁定变量

Locking Variables when Threading in C#

我有一个 C# 程序,我在其中生成一个线程来进行一些计算。然后我将计算结果添加到队列中,并从主线程不断检查队列的长度是否大于 0。如果是,则计算结果出队并在别处使用。

我读到我应该在从任一线程访问队列时锁定队列,因为如果两个线程同时访问它可能会导致问题。但是我应该在对队列做任何事情时锁定它,还是仅在 en-queuing/de-queuing?

时锁定它?

例如

// In main thread

lock (meshDataQueue) {
  if (meshDataQueue.Count > 0)
  {
    constructMesh(meshDataQueue.dequeue())
  }
}

对比

if (meshDataQueue.Count > 0) {
  lock (meshDataQueue)
  {
    constructMesh(meshDataQueue.dequeue())
  }
}

是的,您应该在对 Queue 实例进行任何操作时锁定它(始终使用相同的“锁柜”对象),包括读取队列 Count 等琐碎的事情。 Queue class 不是线程安全的,因此要使其行为保持定义,您必须确保它一次被一个线程访问(在从一个线程切换到另一个线程时使用适当的内存屏障,即lock 声明有力地提供了)。否则,您将进入未定义的行为领域,所有保证都将关闭。