У меня есть программа, которая делает что-то очень интересное. В основном у меня есть три основных потока, все они заняты, и у проблемного потока есть цикл while, который выглядит следующим образом:
while(variable which is always true) {
get some data;
process data;
print message;
}
print end message;
Теперь печатное сообщение печатается в течение первых 400 раундов, но после этого поток просто останавливается. Я попытался сделать эту тему высоким приоритетом. Я попытался уменьшить приоритет других потоков. Самое странное, что это работало ранее, и при отладке другой проблемы (которая была сделана только с помощью операторов print) это начало происходить периодически. Теперь это стало постоянным, как это происходит каждый раз.
Вещи, которые решили это временно (тогда это, казалось бы, перестало работать снова), были:
Снижение уровня печати операторов в других потоках.
Уменьшение приоритета других потоков.
Бег в разное время.
В качестве отказа от ответственности я использую операционную систему реального времени под названием QNX, которая может быть причиной проблемы напрямую. Я надеюсь, что это не так, иначе у нас большое ядро i7 и нет возможности использовать потоки.
К сожалению, код очень длинный и предназначен для работы, поэтому мне не стоит его публиковать. Я надеюсь на помощь, которая укажет мне правильное направление для ее самостоятельного решения. Кто-нибудь знает о проблемах, которые могут вызвать эти симптомы?
Это очень похоже на состояние гонки.
Убедитесь, что ни при каких обстоятельствах заблокированный мьютекс не разблокирован должным образом, поскольку это может привести к тупику.
К сожалению, отладка проблем с потоками очень сложна, так что вы здесь в одиночку.
Программирование потоков: Синхронизация — http://www.cs.cf.ac.uk/Dave/C/node31.html
Прочитайте это, прокрутите вниз до Синхронизация — http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/sys_arch/kernel.html
http://www.qnx.com/developers/docs/6.3.0SP3/neutrino/sys_arch/kernel.html#SCHEDULING
Если все потоки читают одни и те же данные, используйте блокировку.
pthread_mutex_lock( &m );
. . .
while (!arbitrary_condition) {
pthread_cond_wait( &cv, &m );
}
. . .
pthread_mutex_unlock( &m );