// main thread pushes a new jobvoid PushJob( void * jobData ){ pthread_mutex_lock(&theJobSemaphore); theJobs.push_back(Job(jobData)); pthread_mutex_unlock(&theJobSemaphore);}
// one of work threads pops next jobvoid PopJob( void * jobData ){ Job theJob; pthread_mutex_lock(&theJobSemaphore); // lock jobs to extract the last one bool hasJob = theJobs.size() > 0; if (hasJob) { theJob = theJobs.last(); theJobs.pop_back(); } pthread_mutex_unlock(&theJobSemaphore); // unlock jobs for other threads if (hasJob) DoProcessJob(&theJob); // process the job}
C++ (Qt)viod thread(){ for(;;) { mutexActive.lock(); // [1] if( !doProcess ) break; if( dataAvailable ) { // Получили данные из очереди // Вычисления ... // Положили результат в очередь результатов } mutexActive.lock(); }}
C++ (Qt)viod thread(){ forever { mutexActive.lock();... mutexActive.lock();
C++ (Qt)typedef struct{ int do_process; // флаг завершения нити pthread_mutex_t mutexActive; // мутекс активации // Другие внутренние данные для нитки (если нужно)} ThreadData;
C++ (Qt)void *thread_func( void *data ){ assert( data != NULL ); ThreadData *d = (ThreadData*)data; for(;;) { pthread_mutx_lock( d->mutexActive ); ... } return NULL;}