Я нашел ошибку в своей программе, что тот же поток проснулся дважды, воспользовавшись возможностью для запуска другого потока, тем самым вызывая непреднамеренное поведение. В моей программе требуется, чтобы все ожидания потоков выполнялись ровно один раз за ход. Эта ошибка возникает, потому что я использую семафоры, чтобы заставить потоки ждать. С помощью семафора, инициализированного счетчиком 0, каждый поток вызывает down
семафору в начале его бесконечного цикла, а основной поток вызывает up
в цикле for NThreads
(количество потоков) раз. Иногда одна и та же нить принимает вызов up
дважды, и проблема возникает.гарантирует пробуждение всех потоков и только один раз за каждый
Каков способ правильно справиться с этой проблемой? Использует ли переменные условия и трансляцию способ сделать это? Будет ли это гарантировать, что каждый поток пробуждается один раз и только один раз? Каковы другие хорошие возможности?
Ваш вопрос кажется смутным для меня, но в целом да, переменные условия используются для проверки того, разрешено ли выполнение кода. – user2079303
Я не верю, что переменные условий помогут вам сами, вы можете разбудить один поток или разбудить все потоки, но waker не может знать или контролировать, какой блокирующий поток будет разблокирован. К сожалению, я думаю, вам нужен один мьютекс для каждого потока, чтобы управлять состояниями следящего/блочного потока точно так, как вам нужно. – Segfault
Проголосовать за то, что вы отметили c и C++, предотвращая любой нетривиальный ответ – kfsone