相互排斥

时间:2011-03-28 20:13:37

标签: c# multithreading mutual-exclusion

你好我有一个应用程序,在这种情况下使用一个集合来自不同的队列

一个对象在一个线程中排队,而另一个线程在不同的线程中出列

这些操作可能同时会在异常情况下解决,例如,当重新计算集合计数器时,参数超出范围异常。

现在我正在寻找一个“好看的”,并且正确的为什么要从一个外部排除这些行为

(1)我的意思是“好看”是我不想创建我自己的集合派生自这一个包含一个锁(对象)machenisem

(2)我不想使用我讨厌的脑力激荡的想法,这非常“丑陋”

enqueueOk = false;
while (!enqueueOk)
{
       try
       {
           Qsockets.Enqueue(currentSoc);
           enqueueOk = true;
       }
       catch { } 
}

我当然想到使用一个锁或互斥锁,但只有当我将这些动作包装在一个将从每个线程中调用的过程中时才会出现这种情况,abd决定入队或出队也会很长并且“丑陋的”

任何想法都会被批评...... 10x

这是在编辑之后: 因为似乎没有人在下面看到我的答案

我刚刚在自己的集合上使用了锁机制

锁(Qsockets) {    Qsockets.Enqueue(currentSoc); }

7 个答案:

答案 0 :(得分:1)

你能使用TPL吗? ConcurrentQueue自动处理并发活动。

http://msdn.microsoft.com/en-us/library/dd267265.aspx

答案 1 :(得分:1)

如果.Net 4是一个选项,你总是拥有.Net 4的ConcurrentQueue类。它实现了类内的锁定。

答案 2 :(得分:1)

答案 3 :(得分:1)

使用ConcurrentQueue(4.0中提供)。见http://msdn.microsoft.com/en-us/library/dd267265.aspx

答案 4 :(得分:0)

似乎是一个经典的生产者 - 消费者场景。你检查过这个好example吗?

答案 5 :(得分:0)

lock语句是处理这些事情的首选方法,.NET Framework中内置的“线程安全”集合依赖于它们。就这么做。

答案 6 :(得分:0)

我刚从帖子中以字节结尾, 我可以锁定实际的集合

锁(Qsockets) {   Qsockets.Enqueue(currentSoc); }