【问题标题】:Mutual exclusion互斥
【发布时间】:2011-03-28 20:13:37
【问题描述】:

我有一个应用程序使用来自不同线程的集合,在本例中为队列。一个对象在一个线程中入队,而另一个在另一个线程中出队。

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

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

  1. 我所说的“好看”是指我不想创建自己的集合,该集合派生自包含锁定(对象)机制的集合

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

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

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

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

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

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

【问题讨论】:

    标签: c# multithreading mutual-exclusion


    【解决方案1】:

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

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

    【讨论】:

    • ...通过使用锁。我认为 OP 不会显式或隐式地避免 lock 语句。
    • 同意。他不一定说“没有锁”。他只想要一个“好看”的解决方案。这个问题已经解决了。无需重新发明轮子。
    【解决方案2】:

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

    【讨论】:

    • 抱歉,.Net 3.5 已经达到了我需要检查的地方。 10 倍的信息
    • ReactiveExtensions 库是用 3.5 编写的,如果我没记错的话,包括这些类。
    【解决方案3】:

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

        看起来像是经典的生产者-消费者场景。你检查过这个漂亮的example吗?

        【讨论】:

        • 该链接下的主题已过时,现在没有相关信息。
        【解决方案6】:

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

        【讨论】:

        • 我认为 lock 语句在这种情况下不起作用,我尝试将同一个对象锁定在不同的线程上,但它不起作用。
        【解决方案7】:

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

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

        【讨论】:

          猜你喜欢
          • 2011-01-06
          • 2018-05-23
          • 1970-01-01
          • 1970-01-01
          • 2012-06-05
          • 1970-01-01
          • 2011-02-24
          • 2012-12-17
          • 2015-12-20
          相关资源
          最近更新 更多