Многопоточность и pthread_join

Моя программа читает лабиринт из текстового файла, затем основная программа создает 3 разных потока, чтобы копаться в этом лабиринте и искать выход. Когда поток обнаруживает выход, он публикует путь решения в основном потоке.

В этом лабиринте есть ловушки, которые при встрече с потоком «умирают», сохраняя местоположение этой ловушки в глобальном массиве обнаруженных точек ловушек, чтобы другие потоки знали, где их избегать. После того, как этот поток умрет, основная программа возродит другой поток, который займет его место и продолжит движение по лабиринту.

Поток может столкнуться или не столкнуться с ловушкой, и использование pthread_join только ожидает определенного потока. Как заставить основной поток ожидать одновременно каждого из потоков?


person Jary Rym    schedule 13.02.2013    source источник
comment
Как насчет того, чтобы вы присоединялись только к темам, которые каким-то образом сообщили о своей готовности? Например, установить где-нибудь флаг?   -  person PlasmaHH    schedule 13.02.2013
comment
Мои потоки хранятся в массиве pthread_t, поэтому могу ли я использовать для этого глобальное целое число? Вот так: pthread_mutex_lock(&mutex); while(!foundSolution) { pthread_cond_wait(&cond, &mutex); pthread_create(threads[exited], NULL, thrd_func, &pathfinder[exited]); }   -  person Jary Rym    schedule 13.02.2013


Ответы (1)


Используйте переменную условия, которая в pthreads равна pthread_cond_t. Пусть основной поток ожидает переменную условия, и прямо перед тем, как поток умирает, сигнализируйте переменную условия. В псевдокоде примерно так:

основная тема

//spawn first set of threads
while(!done) {
   pthread_cond_wait(&cond, &mutex);
   //spawn another thread
}

рабочий поток

//traverse maze
pthread_cond_broadcast(&cond);
//thread exit

Обратите внимание, что при использовании переменной условия вам необходимо получить и освободить связанный мьютекс. Посмотрите справочную страницу для pthread_cond_wait для более подробной информации.

person Gabriel Southern    schedule 13.02.2013
comment
Один вопрос, который я хочу задать, для рабочего потока: разблокировать ли мьютекс до трансляции сигнала или после (перед выходом)? - person Jary Rym; 14.02.2013
comment
вы должны разблокировать мьютекс после передачи сигнала. - person Gabriel Southern; 14.02.2013