Моя программа читает лабиринт из текстового файла, затем основная программа создает 3 различных потока, чтобы вникать в этот лабиринт и искать выход. Когда поток обнаруживает выход, он публикует свой путь решения в основном потоке.
В этом лабиринте есть подводные камни, которые при столкновении с потоком «умирают», сохраняя местоположение этой ошибки в глобальном массиве обнаруженных точек ошибок, чтобы другие потоки знали, где следует избегать. После того, как этот поток умирает, основная программа возродит другой поток, чтобы занять его место и продолжить обход лабиринта.
Поток может столкнуться или не встретиться с ловушкой, и использование pthread_join ожидает только определенного потока. Как заставить основной поток ждать каждого из потоков одновременно?
Используйте условную переменную, которая в 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
Больше подробностей.
Других решений пока нет …