我有一个接收传入事件并将它们放入作业队列的epoll。
当事件被放入作业队列时,发送pthread条件信号以唤醒工作线程。
但是我遇到了一个问题,即所有工作线程都忙,而且Jobs会在队列中保持堆栈。这是一个严重的问题,因为如果堆叠了Job,并且新事件不会出现,Queue中的Jobs将不会被交给Worker Threads。
一旦线程可用,我希望他们可以自动从作业队列中取出作业(如果可能的话)。
有没有这样做?我能想到的是......添加一个队列观察者并以间隔发送一个条件信号。
另外,我知道STL Queue不是线程安全的。这是否意味着我每次访问STL队列时都必须使用Mutex Lock?这不会减慢我的工作进程吗?
任何解决这个问题的建议都会很棒。
答案 0 :(得分:1)
在生产者 - 消费者队列上计算/发送作业的经典方法是使用信号量。生产者在推动工作后发出信号并且消费者在弹出一个工作之前等待它。您还需要在push / pop周围使用互斥锁来保护队列免受多次访问。
答案 1 :(得分:0)
看一下.NET中的work-stealing thread pool。是的,你必须互斥锁定全局队列,为此我写了一个double-lock deque,所以前面/后面的操作可以并行完成。我也有一个lock-free deque但是客户端应用程序的开销太高了。