gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 12:58:19 24 4
gpt4 key购买 nike

我有一个 C# 程序,我在其中生成一个线程来进行一些计算。然后我将计算结果添加到队列中,并从主线程不断检查队列的长度是否大于 0。如果是,则计算结果出队并在别处使用。
我读过我应该在从任一线程访问队列时锁定队列,因为如果两个线程同时访问它可能会导致问题。但是我应该在对 Queue 执行任何操作时锁定它,还是仅在入队/出队时才锁定它?
例如。

// In main thread

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

最佳答案

是的,您应该锁定 Queue实例(始终使用相同的“locker”对象),无论何时用它做任何事情,包括读取队列的 Count 等琐碎的事情. Queue class 不是线程安全的,因此为了使其行为保持定义,您必须确保一次由一个线程访问它(从线程切换到线程时具有适当的内存屏障,lock 语句稳健地提供)。否则,您将进入未定义的行为领域,所有保证均在此关闭。

关于c# - 在 C# 中线程化时锁定变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65496986/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com