这里有一个比较有趣的问题。我有一个类,负责将多个处理操作复用到固定数量的线程上。典型情况是生产者/消费者问题,其中每个操作由WaitHandle(在这种情况下,是跟踪队列中有多少项的信号量)和要调用的委托组成。
例如,如果我有两个生产者(A和B),它们将项目生产到两个不同的队列中。我不会为每个生产者创建两个消费者线程(A1、A2、B1、B2),而是将这四个“线程”复用到两个线程上。这个“复用器”的代码大致如下(稍微简化了一下):
感谢您的帮助,SO。
例如,如果我有两个生产者(A和B),它们将项目生产到两个不同的队列中。我不会为每个生产者创建两个消费者线程(A1、A2、B1、B2),而是将这四个“线程”复用到两个线程上。这个“复用器”的代码大致如下(稍微简化了一下):
WaitHandle[] waitHandles = new WaitHandle[2];
waitHandles[0] = NumberOfItemsFullInProducerAQueue;
waitHandles[1] = NumberOfItemsFullInProducerBQueue;
while(true)
{
int index = WaitHandle.WaitAny(waitHandles);
if(index == 0)
{
// handle the item from queue A
}
else
{
// handle the item from queue B
}
}
我正试图将这个概念扩展到一个稍微复杂一些的例子上,在这个例子中,一个操作可能需要多个等待句柄被满足才能执行。我想知道是否有一种 WaitHandle.Combine(waitHandle1, waitHandle2) 的调用方式可以将两个等待句柄合并成一个单独的等待句柄。最终结果将是:
A,B,C,D are waitHandles
E = Combine(A, B)
F = Combine(C, D)
waitHandles = { E, F }
while(true)
{
int index = WaitHandle.WaitAny(waitHandles);
if(index == 0)
{
}
else
{
}
}
额外的分数?
虽然不是必须的,但如果等待句柄的组合可以相交,那将非常好。例如,像这样:
A,B,C are waitHandles
D = Combine(A, B)
E = Combine(A, C)
waitHandles = { D, E }
// same as above from here
感谢您的帮助,SO。