Заголовок: Потерянный процесс пробуждения в tx_thread_suspend()/tx_thread_resume() из-за несинхронизированного предикатаLinux

Anonymous
Заголовок: Потерянный процесс пробуждения в tx_thread_suspend()/tx_thread_resume() из-за несинхронизированного предиката

Сообщение Anonymous »

У нас есть основной поток, который периодически вызывает tx_thread_resume(&Secondary). Вторичный поток выполняет одну итерацию работы, а затем блокируется через tx_thread_suspend(&Secondary).
Мы подозреваем, что это классическая гонка потерянного пробуждения в адаптере Linux: предикат/флаг «приостановлено» обновляется в одном контексте синхронизации, но ожидание/сигнал с переменной условием выполняется под другим (или без него) мьютексом, поэтому не существует единого цепочка «событие-прежде» между:
  • установкой/очисткой флага приостановки и
  • входом/выходом из cond_wait().
В результате может произойти возобновление(), пока Secondary переходит в режим приостановки; пробуждение фактически «теряется», Secondary вводит cond_wait(), а последующие возобновления могут игнорироваться (например, из-за проверок состояния), в результате чего Secondary блокируется навсегда.
Вопрос (поскольку это симуляция, а не реальный поток продукта):

Каков рекомендуемый способ надежно воспроизвести эту гонку с помощью тестового оборудования? В частности, какую загрузку/тайминг/чередование вы предлагаете использовать в окне, в котором флаг обновляется, но ожидание еще не установлено, чтобы мы могли вызвать сбой «постоянной приостановки»?

Подробнее здесь: https://stackoverflow.com/questions/798 ... ue-to-unsy

Вернуться в «Linux»