在 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
声明有力地提供了)。否则,您将进入未定义的行为领域,所有保证都将关闭。
我有一个 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
声明有力地提供了)。否则,您将进入未定义的行为领域,所有保证都将关闭。