作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个 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/
我是一名优秀的程序员,十分优秀!