0

首先,我为一个冗长的请求道歉。

我有一个基础设施,其中有多个线程,每个线程都在等待它们的 WaitHandle (AutoResetEvent) 直到有活动排队。出于以下原因,我正在考虑更改该基础架构。每个线程都在自己的活动上工作。(我有一组不同的活动要管理)。

我认为当前基础架构的缺点是我拥有与线程(活动)本身的数量一样多的等待句柄,并且哪个(线程数)可以保持增加或减少。

当前逻辑如下 一组线程,每个线程都关联自己的AutoResetEvent & activity Thread1-Event1-activity1 Thread2-Event2-activity2

Activity
{
   Thread th;
   AutoResetEvent ev;
   Operation();
}

每个线程执行一个循环并在循环内执行一个操作。

伪代码如下。

while(event.Wait())
{
   //Execute operation (activity-n)
}

因此,将操作排队到线程的控制器只需设置事件,线程完成其任务并返回等待activity-n的下一个请求

Activity.event.Set();

为了减少所使用的 WaitHandles 的数量,我想到的基础设施是在所有线程中使用一个信号量。

将信号量计数设置为 100 的任意最大值。将信号量的初始计数设置为 0。

Semaphore sem = new Semaphore(0,100); 
Thread [] threads = new Threads(100);

现在信号量对于所有线程基本上都处于锁定状态。

现在所有线程都像以前一样执行循环

while(sem.Wait())
{
       //deque activity
       //perform activity

}

除了没有固定的活动线程(活动排队到集中并发队列)。将活动排队的控制器执行以下操作。

queue.Enqueue(activity-n);

//To release one of the threads from the waiting threads to execute the activity.
semaphore.Release(1). 

信号量实现会比多重 WaitHandle 方法更好吗?如果是,为什么?我确实觉得单一的信号量方法意味着增加的争用。

如果有人可以对此有所了解。那会很好。

更新: 我没有使用 BlockingCollection,因为我的请求队列有点独特。我的条件是我有多种活动(类型 1 到 n),并且当一个类型为 n 的活动被执行时,不能执行多个相同类型的活动(比如 n)。这就是为什么最初我每个活动类型都有一个线程。我试图将所涉及的等待句柄减少到 1,这就是为什么我试图查看信号量方法是否适合。但是我担心的是,如果我去信号量路线,我会增加锁竞争。在我的场景中,我可能随时有一个或两个线程处于活动状态,这意味着所有剩余的线程将争夺信号量中已打开的一两个开放槽。

4

0 回答 0