Заголовок: Потерянный процесс пробуждения в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

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