Кажется, я захожу в возможный тупик с условной переменной pthreads.
Вот код
thread function(){
for (condition){
do work
/* should the thread continue? */
if (exit == 1){
break; /* exit for */
}
} /* end for */
pthread_mutex_lock(&mtxExit);
exit = 0;
pthread_cond_signal(&condVar);
pthread_mutex_unlock(&mtxExit);
}
Основная функция заключается в следующем:
function main(){
if (thread is still active){
pthread_mutex_lock(&mtxExit);
exit = 1;
pthread_mutex_unlock(&mtxExit);
} /* end if */
while (exit == 1){
pthread_mutex_lock(&mtxExit);
/* check again */
if (exit == 1)
pthread_cond_wait(&condVar, &mtxExit);
pthread_mutex_unlock(&mtxExit);
}
create new thread()
....
}
Код всегда застревает на cond_wait. :(
РЕДАКТИРОВАТЬ:
Позвольте мне добавить некоторые пояснения к теме, чтобы объяснить, что я делаю.
В любой момент времени мне нужно запустить только один поток. У меня есть функция, которая запускает поток, сообщает ему, что делать, и основной поток продолжает работу.
В следующий раз, когда основной поток решит, что ему необходимо создать другой поток, он должен убедиться, что ранее запущенный поток завершился. У меня не может быть двух живых потоков одновременно, так как они будут мешать друг другу. Это сделано по замыслу и по определению проблемы, над которой я работаю.
Вот где я сталкиваюсь с проблемами.
Это мой подход:
Запустите поток, пусть он сделает свое дело.
поток проверяет на каждом этапе своей работы, актуален ли он. Вот тут-то и на сцену выходит «выход». Основной поток устанавливает для «exit» значение 1, если ему нужно сообщить потоку, что он больше не актуален.
В большинстве случаев поток завершится до того, как основной поток решит создать другой поток. Но мне все еще нужно учитывать тот случай, когда поток все еще жив к тому моменту, когда основной поток будет готов запустить другой.
Таким образом, основной поток устанавливает значение «exit» и должен дождаться завершения потока. Я не хочу использовать pthread_kill с 0 в качестве сигнала, потому что тогда основной поток будет в цикле, тратя циклы ЦП. Мне нужен основной поток, чтобы отказаться от управления и спать / ждать, пока поток не завершится.
Поскольку мне нужен только один поток за раз, мне не нужно беспокоиться о масштабировании до большего количества потоков. Решение никогда не будет иметь более одного потока. Мне просто нужен надежный механизм, чтобы проверить, жив ли мой поток, если он есть, сообщите ему о выходе, дождитесь его выхода и начните следующий.
Судя по моему тестированию, похоже, что основной поток все еще входит в условную переменную, даже если поток мог выйти или что сигнал вообще не доставляется в основной поток. И его ждут там вечно. И в некоторых случаях в отладчике я вижу, что значение выхода установлено на 0, и по-прежнему основной поток ожидает сигнала. Кажется, где-то есть состояние гонки.
Я не фанат того, как я настраиваю код прямо сейчас, это слишком беспорядочно. На данный момент это всего лишь доказательство концепции, скоро я перейду к лучшему решению. Моя задача - надежно сигнализировать потоку о выходе и ждать его завершения.
Я ценю ваше время.
exit
? - person Andres Jaan Tack   schedule 27.08.2010