2013-05-11 2 views
2

У меня есть два разных потока (рядом с основной резьбой).Критический раздел при чтении данных по темам

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

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

В этом случае (в основной и второй резьбе) необходим критический раздел для обеспечения безопасности?

+0

Это действительно зависит от того, какие данные нужно писать и читать. Если есть сомнения: используйте критический раздел. – OnTheFly

+0

Спасибо. Мне нужен был ответ в целом, и для меня достаточно ответа. – Artik

ответ

4

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

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

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

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

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

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

+4

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

+0

Если переменная ** s ** вместе представляет некоторое составное состояние, это состояние уже не будет безопасным, даже если его компоненты являются атомарными. Кроме того, структурированные типы> Указатель не являются атомарными. – OnTheFly

+0

@Artik, строки не атомные – OnTheFly

Смежные вопросы