У меня есть 10 потоков, которые должны ожидать сигнала.До сих пор я просто выполнял 'sleep (3)', и это работало нормально, но есть ли более безопасный способ убедиться, что все потоки созданы и действительно ожидают.
Я сделал следующую конструкцию, где я в критической области перед ожиданием увеличиваю счетчик, сообщающий, сколько потоков ожидает.Но тогда у меня должен быть дополнительный мьютекс и условный сигнал для того, чтобы сообщить основному, что все потоки созданы, это кажется слишком сложным.
Мне не хватает некоторого базового шаблона проектирования потоков?
Спасибоedit: фиксированные типы
edit: уточняющая информация ниже
В этом случае барьер не будет работать, потому что я не заинтересован в том, чтобы мои потоки ожидали, пока все потоки не будут готовы.Это уже происходит с 'cond_wait'.
Мне интересно, чтобы основная функция знала, когда все потоки готовы и ожидают.
//mutex and conditional to signal from main to threads to do work
mutex_t mutex_for_cond;
condt_t cond;
//mutex and conditional to signal back from thread to main that threads are ready
mutex_t mutex_for_back_cond;
condt_t back_cond;
int nThreads=0;//threadsafe by using mutex_for_cond
void *thread(){
mutex_lock(mutex_for_cond);
nThreads++;
if(nThreads==10){
mutex_lock(mutex_for_back_cond)
cond_signal(back_cond);
mutex_unlock(mutex_for_back_cond)
}while(1){
cond_wait(cond,mutext_for_cond);
if(spurious)
continue;
else
break;
}
mutex_unlock(mutex_for_cond);
//do work on non critical region data
}
int main(){
for(int i=0;i<10)
create_threads;
while(1){
mutex_lock(mutex_for_back_cond);
cond_wait(back_cond,mutex_for_back_cond);
mutex_unlock(mutex_for_back_cond);
mutex_lock(mutex_for_cond);
if(nThreads==10){
break;
}else{
//spurious wakeup
mutex_unlock(mutex_for_cond);
}
}
//now all threads are waiting
//mutex_for_cond is still locked so broadcast
cond_broadcast(cond);//was type here
}