c# - C#中的队列同步和操作

标签 c# multithreading thread-safety queue

如果队列已同步:

var _item = Queue.Synchronized(new Queue());

我可以在不使用锁定语句的情况下调用诸如 Enqueue 和 Dequeue 之类的方法吗?

我当前的代码是:

lock (_item.SyncRoot)
{
    _item.Enqueue(obj);
}

我可以线程安全地使用:

_item.Enqueue(obj);
var item = _item.Dequeue();

最佳答案

Enqueue的调用和对Dequeue的调用是线程安全的。
但是,您的示例代码不是:
在调用 Enqueue 和调用 Dequeue 之间可能有一个线程切换。这意味着,item 可能是 obj 之外的另一个实例,或者对 Dequeue 的调用会抛出异常,因为它现在是空的。

为了使您的示例代码线程安全,您仍然需要显式锁定:

lock(_item.SyncRoot)
{
    _item.Enqueue(obj);
    var item = _item.Dequeue);
}

只有现在可以保证,item 引用在所有情况下都等于 obj

关于c# - C#中的队列同步和操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6747823/

相关文章:

android - await 是否阻塞了 Android 上的 UI 线程?

.net - 多处理器和多核之间的区别

java - 两种单例实现都同样支持多线程吗?

c - 共享库局部变量线程安全吗?

c++ - libstdc++ 中的 ostream operator<< 是线程敌对的吗?

c# - 根据主视图自定义过滤器更新局部 View

c# - StateHasChanged() 重新渲染组件两次

c# - GridView 中的 Colspan=2

cuda - 使用 cuCtxSetCurrent 时需要什么样的线程安全?

C#8 : Switch ref expressions