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()本身都线程安全的,因为你需要记住的是,队列可以当你与皮克检查之间,出列变化(),当你的行为的信息它给你( ).你需要确保锁定两个部分.
不,你应该仍然锁定每个Peek()电话.
由于Queue内部使用数组,因此其实例方法不是线程安全的,因为数组可以随时由不同的线程更改.
Peek() 还会检查队列长度,以便在返回实际值之前查看队列中是否有元素,而某些其他线程可能会在方法实际返回这些值之前删除这些元素.
| 归档时间: |
|
| 查看次数: |
2351 次 |
| 最近记录: |