Что происходит, когда поток пытается получить доступ к заблокированному мьютексу ресурсу? - PullRequest
0 голосов
/ 11 августа 2011

В настоящее время я создаю программу SDL / OpenGL, которая отображает объекты на основе нескольких переменных состояния. Эти переменные состояния постоянно обновляются в отдельном потоке с определенной пользователем скоростью. Время от времени основной поток асинхронно должен поменять местами некоторые из этих переменных состояния.

Теперь эти переменные состояния в основном являются указателями, поэтому, когда я обновляю их из основного потока (т. Е. Асинхронно относительно потока обновления), я сначала создаю блокировку мьютекса, удаляю объекты, создаю / заменяю их на их новые те, а затем разблокировать мьютекс. Тем не менее, поток обновления все еще работает в течение этого времени.

Из-за этого последнего пункта мне было любопытно. Что произойдет, если поток попытается получить доступ к любой из этих переменных состояния mid-asynchronous-update? Я знаю, что это не разрешено (из-за блокировки мьютекса), но что происходит за кадром?

1 Ответ

1 голос
/ 11 августа 2011

Если вы не закроете свой код обновления блокировкой и разблокировкой мьютекса, поток обновления (ваш последний пункт) не будет заботиться о блокировке основным потоком. Это просто обновит эти данные.

Вы должны использовать один и тот же объект мьютекса (просто создайте его для всего потока обновления и основного потока) в потоке обновления перед обновлением переменных. Таким образом, основной поток не получит доступ к этим данным, пока поток обновления осуществляет доступ, и наоборот.

Возможно, вы захотите внимательно посмотреть, как мьютекс используется для синхронизации потоков.

ОБНОВЛЕНИЕ: ДЛЯ ВАШЕГО ВОПРОСА

"Таким образом, везде, где у меня есть переменная, небезопасная для потока, я должен окружать все обращения к этой переменной одним и тем же мьютексом?"

Да, но вам также следует знать о сценариях, в которых может возникнуть тупик. взаимоблокировки являются основной причиной, по которой многопоточность избегается во многих приложениях или, другими словами, многим многопоточность не нравится.

...