Queue.Peek线程安全吗?

rem*_*dao 1 c# queue multithreading

对32位字段的读操作是原子的.因此,如果队列持有对象引用,Queue.Peek方法应该是线程安全的,对吧?

Joe*_*orn 18

不,即使是这样,也忽略了这一点.让我们假设一个线程安全的窥视片刻.您通常最终编写的代码执行类似这样的操作:

if (MyQueue.Peek() != null)
  var item = MyQueue.Dequeue();
Run Code Online (Sandbox Code Playgroud)

这是在多线程代码中的错误,即使Peek()Dequeue()本身都线程安全的,因为你需要记住的是,队列可以当你与皮克检查之间,出列变化(),当你的行为的信息它给你( ).你需要确保锁定两个部分.


Gro*_*roo 7

不,你应该仍然锁定每个Peek()电话.

由于Queue内部使用数组,因此其实例方法不是线程安全的,因为数组可以随时由不同的线程更改.

Peek() 还会检查队列长度,以便在返回实际值之前查看队列中是否有元素,而某些其他线程可能会在方法实际返回这些值之前删除这些元素.