线程池和作业队列体系结构

Thread Pool and Job Queue Architecture?

本文关键字:体系结构 作业队列 线程      更新时间:2023-10-16

我有一个epoll来接收传入事件并将它们放入作业队列中。

当事件被放入作业队列时,pthread条件信号被发送以唤醒工作线程。

然而,我遇到了一个问题,所有的工作线程都很忙,Jobs总是堆积在队列中。这是一个严重的问题,因为如果作业被堆叠,并且新事件在一段时间内不会出现,队列中的作业将不会交给Worker Threads。

一旦线程可用,我希望他们可以自动从作业队列中获取作业(如果可能的话)。

有办法这样做吗?我所能想到的就是…添加一个队列观察器并每隔一段时间发送一个条件信号。

另外,我知道STL队列不是线程安全的。这是否意味着每次访问STL队列时都必须使用互斥锁?这难道不会减慢我的工作进度吗?

任何解决这个问题的建议都很好。

对生产者-消费者队列上的作业进行计数/发出信号的经典方法是使用信号量。生产者在推送一个作业后发出信号,消费者在弹出一个作业之前等待它。你也需要在推送/弹出周围有一个互斥锁来保护队列免受多次访问。

看看.NET中的工作窃取线程池。是的,你必须对全局队列进行互斥锁定,为此,我编写了一个双锁deque,这样前/后操作就可以并行完成。我也有一个无锁的deque,但客户端应用程序的开销太高了。