|
Boost Users : |
Subject: [Boost-users] [boost-users] [boost_thread] Condition
From: Eloi Du Bois (eloi.du.bois_at_[hidden])
Date: 2010-11-26 05:48:16
Hi all,
I would like to know how can I do the following:
I have n working threads. Each one has a loop preceded by a wait condition
(1).
When the wait condition is unlocked, the thread takes a task on a queue, and
process the task.
I need to make something in the submit task function that wait until all
processes are on the wait condition (1).
How can I do that ?
I tried a while(!_nWorking) {} but this is not clean.
Here follows my threads function:
void ProcessingThread::dispatcher( const int idx )
{
using namespace boost;
mutex::scoped_lock readyLocker( _dispatchMutex[idx] );
while( !_bDispStop )
{
--_nWorking;
// Wait for a task
_condProcessIn[idx].wait( readyLocker );
++_nWorking;
while( !_bDispStop && !_pendingQueues[idx].empty() )
{
_pendingQueuesMutex[idx].lock();
Task task = _pendingQueues[idx].front();
_pendingQueues[idx].pop_front();
_pendingQueuesMutex[idx].unlock();
// Process node
assert( task._proc );
assert( task._procData );
task._proc->execute( task._range, *task._procData );
}
}
}
Launched via:
_nWorking = _nCpu;
for( std::size_t i = 0; i < _nCpu; ++i )
{
// Create dispatcher thread
_dispThrdGroup.create_thread( boost::bind(
&ProcessingThread::dispatcher, this, i ) );
}
Submit task function:
void ProcessingThread::submitProcess( ProcessLauncher * proc, const
FrameRange & range, ProcessData & procData )
{
// Get the index of the less used queue
std::size_t idx = getLessUsedQueueIdx();
_pendingQueuesMutex[idx].lock();
// Append a task to the less used queue
_pendingQueues[ idx ].push_back( Task( proc, range, procData ) );
// Signal that a task is ready
_condProcessIn[idx].notify_one();
_pendingQueuesMutex[idx].unlock();
/// UGLY !
while( _nWorking ) {
}
}
Thank you in advance,
Eloi Du Bois.
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net