0

我有一个应用程序使用来自不同线程的集合,在这种情况下是队列。一个对象在一个线程中入队,而另一个在另一个线程中出队。

当重新定义集合计数器时,这些操作可能会同时发生,这将解决异常,例如参数超出范围异常。

我正在寻找一种“好看”以及正确的为什么要相互排除这些行为。

  1. 我所说的“好看”的意思是我不想创建我自己的从这个包含锁(对象)机制的集合

  2. 我不想使用我的头脑风暴的想法,这很“丑陋”

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

我当然想使用锁或互斥锁,但只有当我将这些操作包装在一个将从每个线程调用的过程中,并决定入队或出队,这也将是长且“丑陋”

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

我只是在集合本身上使用了锁定机制

lock(Qsockets)
{
   Qsockets.Enqueue(currentSoc); 
}
4

7 回答 7

1

可以使用 TPL 吗?ConcurrentQueue 自动处理并发活动。

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

于 2011-03-28T20:16:44.323 回答
1

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

于 2011-03-28T20:19:37.380 回答
1

您可以使用并发队列同步队列

于 2011-03-28T20:20:06.800 回答
1

使用 ConcurrentQueue(在 4.0 中可用)。请参阅http://msdn.microsoft.com/en-us/library/dd267265.aspx

于 2011-03-28T20:21:25.160 回答
0

看起来像是经典的生产者-消费者场景。你检查过这个很好的例子吗?

于 2011-03-28T20:18:04.840 回答
0

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

于 2011-03-28T20:18:10.717 回答
0

我刚刚从一个以字节为单位的帖子得出结论,我可以锁定实际的集合

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

于 2011-03-28T22:26:49.813 回答