Я думаю, что мне не хватает фундаментальной схемы проектирования, касающейся мультипрограммирования.
Я нашел решение проблемы, но я бы сказал, что она слишком сложная.
При запуске программы я выделяю статический пул рабочих и главный поток, которые живут на протяжении всего выполнения программы. (псевдокод ниже)
void *worker(){
while(1){
//perworker mutex lock
//wait for workerSIGNAL
//do calculations
//perworker mutex unlock
}
}
Мой главный поток сигнализирует всем моим рабочим, когда рабочие закончили, они ждут следующего сигнала от главного потока. (псевдокод ниже)
void *master(){
while(1){
//masterMutex lock
//wait for masterSignal
//signal all workerthread to start running
/*
SHOULD WAIT FOR ALL WORKER THREADS TO FINISH
(that is when workers are done with the calculations,
and are waiting for a new signal)
*/
//materMutex unlock
}
}
Мой главный поток получает сигнал от другой части моего кода (не потока), что означает, что существует только один главный поток. (псевдокод ниже)
double callMaster(){
//SIGNAL masterThread
//return value that is the result of the master thread
}
Моя проблема в том, как заставить masterthread ожидать выполнения всех рабочих (ожидание следующего workerSignal)?
Мое решение необычайно сложное.
У меня есть барьер в моих рабочих потоках, который ожидает завершения всех рабочих потоков, а затем из одного из моих потоков (threadId = 0) я сигнализирую условное условие workerDone, ожидаемое в нижней части моей главной темы.
Работает, но не красиво, любые идеи по улучшению приветствуются.
Спасибо.