2010-03-01 24 views
3

对于某些并发代码,我想将一堆信号连接成一个电路。在.NET中,我们可以对一组信号执行WaitAll或WaitAny。我想做这样的事情:如何将信号连接到.NET中的复杂电路?

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

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

[编辑:科里要求更多信息]

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

回答

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方法调用,但例子是只是为了验证这个想法没有提供一个完整的解决方案。

+0

我不敢相信我也在这么做。 :) – Tanzelax 2010-03-02 00:16:59

+0

不幸的是,这将为电路中的每个子树分配一个线程。我想要近10K,所以这不会扩展。 API的设计很困难,例如,返回值将如何告诉您在WaitAny中实际触发了哪个子树?想想真正疯狂的深层信号树。 – projectshave 2010-03-02 14:36:57

+0

@projectshave:Ya每个组的线程都不会扩展,但是您可以创建一个单独的线程,以低超时的方式为'WaitAll'负责。仍然不可扩展。 WaitAny返回传入的数组中的对象的索引,以便知道哪个信号被触发。也许你可以用你试图解决的基本问题来更新你的问题,并且有人可能比你描述的WaitAny(WaitAll(),WaitAll())方法有更好的解决方案。 – 2010-03-02 16:02:21

-1

我不相信.NET支持这一点,也不支持任何语言。我必须用低级别的基元来做到这一点。

+0

是的,现在有一种方法,Rx扩展。 – 2010-03-12 16:29:28

+0

如果您更新了答案,我可以撤消该投票。我不是故意要在这里投票。 – 2010-03-12 18:26:37