Критическая секция при чтении данных потоками

У меня есть два разных потока (помимо основного потока).

Первый отправляет в основной поток PostMessage с данными. В результате получения сообщения основной поток модифицирует соответствующие глобальные переменные (разные типы).

Другой поток (второй) периодически читает эти переменные.

Нужно ли в этом случае (в основном потоке и втором потоке) использовать критическую секцию для безопасности?


person Artik    schedule 11.05.2013    source источник
comment
Это действительно зависит от того, какие данные записывать и читать. Если сомневаетесь: используйте критическую секцию.   -  person OnTheFly    schedule 11.05.2013
comment
Спасибо. Мне нужен был ответ в общем и вашего ответа мне достаточно.   -  person Artik    schedule 11.05.2013


Ответы (1)


Ваш код будет в безопасности, если вы защитите любой доступ к общим переменным с помощью критической секции (замка).

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

Например, если у вас есть целое число, содержащее число, вам не нужно будет использовать блокировку. Нить для письма можно безопасно модифицировать, а нить для чтения никогда не порвется. Если у вас было несколько потоков записи, вам, вероятно, потребуется использовать блокировку или функцию блокировки.

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

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

В конечном счете, я не могу точно сказать, безопасен ли ваш код, потому что вы его не показали. Описание кода — это только то, что нужно. Вы действительно должны опубликовать свой код для такого вопроса.

person David Heffernan    schedule 11.05.2013
comment
Даже если переменная может быть прочитана/записана в одной инструкции (атомарной), потокобезопасность не гарантируется. Несколько потоков записи, как вы упомянули, нуждаются в блокировке, также один распространенный сценарий - это когда у вас есть несколько переменных, и реализация требует, чтобы они всегда были согласованы друг с другом. - person LU RD; 11.05.2013
comment
Если переменныеs вместе представляют какое-то составное состояние, это состояние больше не будет безопасным, даже если его компоненты являются атомарными. Кроме того, структурированные типы › Pointer не являются атомарными. - person OnTheFly; 11.05.2013
comment
@Artik, строки не атомарны - person OnTheFly; 11.05.2013
comment
@LURD Действительно. Отсюда использование слова may во втором абзаце. Отсюда и подстраховка ставок в последнем абзаце. - person David Heffernan; 11.05.2013