多线程访问Queue.DeQueue(),哪种方式最高效?

fihuang 2010-04-11 07:34:36
多线程访问Queue<T>.DeQueue(),怎么控制?

Queue<string> q

多线程从q取数据出队列的时候,我是这样写的:

string s = "";
lock(q)
{
if(q.Count > 0)
{
s = q.DeQueue();
}
}

有没有更加高效的方法,我这样加锁,可能会影响效率。

还有一个问题,DeQueue()的时候要加锁,那EnQueue()需不需要加锁呢?
衷心请教各位前辈,先谢谢大家。
...全文
1108 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
人工智能算法 2010-04-13
  • 打赏
  • 举报
回复

只有访问共同的对象的时候才会使用lock 否则不需要使用

比如一个对象

public static int count =0;//这个对象如果被不同方法可能同时访问,这需要使用lock


lllanm 2010-04-13
  • 打赏
  • 举报
回复
Queue<T>
1 多线程调用, 不论是进出都加锁吧, 保证数据原子性. 帮助文档明确提示会有InvalidOperationException产生
2, 通常情况可以用LOCK 建议用DLLIPORT API中显得临届区更高效
herty 2010-04-13
  • 打赏
  • 举报
回复
标记看看.
S314324153 2010-04-13
  • 打赏
  • 举报
回复
线程间没有共享数据、变量什么的,可以不加
fihuang 2010-04-13
  • 打赏
  • 举报
回复
众说纷纭 有的说要 有的说不要
大家在讨论讨论 多听听意见
weberwong 2010-04-12
  • 打赏
  • 举报
回复
仔细看我的回复啊,写了那么多呢

1.两个线程同时进队需要加锁吗?
2.两个线程同时出队需要加锁吗?
3.两个线程同时访问队列,一个出队、一个进队,需要加锁吗?

这三个问题可以一起答
如果你的进队和出队都只有一句话,那就不需要锁
如果有逻辑判断,比如判断是否队列里有东西才出队,没满才进队,那就是两步,需要锁
fihuang 2010-04-12
  • 打赏
  • 举报
回复
我在重新问一下吧:
1.两个线程同时进队需要加锁吗?
2.两个线程同时出队需要加锁吗?
3.两个线程同时访问队列,一个出队、一个进队,需要加锁吗?
白s菜 2010-04-11
  • 打赏
  • 举报
回复
我也遇到多线城操作队列的问题咎结啊
xray2005 2010-04-11
  • 打赏
  • 举报
回复
写入队列(插入)和从队列读取(移除)数据都需要加锁,加锁的目的是为了同步线程,
weberwong 2010-04-11
  • 打赏
  • 举报
回复
这样说吧,加锁是为了把一个多步操作变为原子操作,可以理解和数据库的事务有一些相似
1.两个线程同时进队需要加锁吗?
2.两个线程同时出队需要加锁吗?
3.两个线程同时访问队列,一个出队、一个进队,需要加锁吗?
理论上不需要,因为进队出队都是原子操作

但是
if(q.Count > 0)
{
s = q.DeQueue();
}
这个代码需要,因为q.Count和q.DeQueue()是两步操作,两个分别是原子操作,但加在一起就不是了
也就是说,在多线程情况下,两步操作中间会有其它线程也在工作,导致两步操作的前提出现区别
比如
if(q.Count > 0)这步结果是true,开始执行下一步
但这个时候第二个线程也刚判断完,开始执行DeQueue()操作,这时候必然会有一个线程出错(当两个线程进入前Count == 1的时候)
fihuang 2010-04-11
  • 打赏
  • 举报
回复
我在重新问一下吧:
1.两个线程同时进队需要加锁吗?
2.两个线程同时出队需要加锁吗?
3.两个线程同时访问队列,一个出队、一个进队,需要加锁吗?

另外,好像.net的队列本身就有一个并发同步机制,我不知道是上面的哪一种?

Joe-xXx 2010-04-11
  • 打赏
  • 举报
回复
消息队列本来就可以用来解决并发性问题!
weberwong 2010-04-11
  • 打赏
  • 举报
回复
lock是一种互斥锁,只有大于一个位置加了锁才有意义,所以EnQueue()肯定也是要加的
这个锁粒度没什么问题,.Count和.DeQueue()是两步操作,锁可以把这两步变为一个原子操作
  • 打赏
  • 举报
回复
写入队列(插入)和从队列读取(移除)数据都需要加锁,加锁的目的是为了同步线程,
效率肯定会低点,你可以做下测试,时间应该是以微秒计,可以忽略不计

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧