Fix a situation where some threadpool work items are never executed.

Fixes #6349
This commit is contained in:
Gunnar Beutner 2014-05-28 15:57:48 +02:00
parent fdc2ef6190
commit 157de9f3bb
2 changed files with 6 additions and 3 deletions

View File

@ -272,8 +272,9 @@ void ThreadPool::ManagerThreadProc(void)
int tthreads = wthreads - alive;
/* Make sure there is at least one thread per CPU */
if (alive + tthreads < std::max(boost::thread::hardware_concurrency(), 4U))
tthreads = 1 - alive;
int ncput = std::max(boost::thread::hardware_concurrency() / QUEUECOUNT, 1U);
if (alive + tthreads < ncput)
tthreads = ncput - alive;
/* Don't kill more than 8 threads at once. */
if (tthreads < -8)

View File

@ -30,6 +30,8 @@
namespace icinga
{
#define QUEUECOUNT 4
/**
* A thread pool.
*
@ -118,7 +120,7 @@ private:
boost::condition_variable m_MgmtCV;
bool m_Stopped;
Queue m_Queues[4];
Queue m_Queues[QUEUECOUNT];
void ManagerThreadProc(void);
};