3

对于一些并发代码,我想将一堆信号像电路一样连接在一起。在 .NET 中,我们可以对信号集合执行 WaitAll 或 WaitAny。我想做这样的事情:

WaitAny ( WaitAll (c1, c2), WaitAll (c3, c4) ) ;

不幸的是,该库不支持将这些操作组合成更复杂的树。我的问题是(1)有没有办法在 .NET 中做到这一点?(2) 是否有任何语言的精巧库?

[编辑:科里询问更多细节]

我想建立一个消息传递库。可能有 10K 小并发队列,其中一些带有消息。我想从队列中获取消息并执行分配给队列的处理程序。但是,在处理程序完成之前我无法获取下一条消息(每个队列单线程)。所以我真的想在弹出并执行下一个项目之前等待队列(收到消息?)和代码(完成上一条消息?)。

4

3 回答 3

1

我可能误解了这个问题。但是反应式框架(Rx)会是您正在寻找的吗?它应该允许以您正在寻找的方式组合事件。

http://msdn.microsoft.com/en-us/devlabs/ee794896.aspx

于 2010-03-12T16:07:16.003 回答
1

我什至不敢相信我在建议这个,但是您可以让其他线程执行WaitAll调用并触发您在 WaitAny 中侦听的单独信号(每组 WaitAll 一个唯一的)。闻起来真的很糟糕,对于应该简单的事情来说似乎过于复杂。我可能会后悔点击Post Your Answer;-)

ManualResetEvent _Group1Event = new ManualReset(false);
ManualResetEvent _Group2Event = new ManualReset(false);

void SomeThread()
{
    ...
    WaitHandle.WaitAny(_Group1Event, _Group2Event);
    ...
}

void Group1WatcherThread()
{
    ...
    if (WaitHandle.WaitAll(c1, c2))
    {
       _Group1Event.Set();
    }
    ...
}

void Group2WatcherThread()
{
    ...
    if (WaitHandle.WaitAll(c3, c4))
    {
       _Group2Event.Set();
    }
    ...
}

不确定我的 WaitAll/WaitAny 方法调用,但该示例只是为了展示这个想法而不是提供完整的解决方案。

于 2010-03-02T00:15:31.310 回答
-1

我不相信 .NET 和任何语言都支持这一点。我将不得不用低级原语来做这件事。

于 2010-03-12T15:41:28.617 回答