Что относительно состояния состязания в многопоточном чтении?

В соответствии со статьей о IBM.com, "состояние состязания является ситуацией, в которой два или больше потока или процессы читают или пишут некоторые совместно используемые данные, и конечный результат зависит от синхронизации того, как потоки планируются. Условия состязания могут привести к непредсказуемым результатам и тонким ошибкам программы".. Хотя статья касается Java, мне в целом преподавали то же определение.

Насколько я знаю, простая операция чтения из RAM состоит из установки состояний определенных входных строк (адрес, читайте и т.д.), и чтение состояний выходных строк. Это - операция, которая, очевидно, не может быть выполнена одновременно двумя устройствами и должна быть сериализирована.

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

Так, вопрос: нужно реализовать монопольную блокировку для чтения при использовании многопоточности (в WinAPI, например)? В противном случае, почему? Где это управление реализовано - ОС, аппаратные средства?

С наилучшими пожеланиями, Kuba

10
задан jmich 22 April 2010 в 13:20
поделиться

3 ответа

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

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

8
ответ дан 4 December 2019 в 01:00
поделиться

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

3
ответ дан 4 December 2019 в 01:00
поделиться

На этот вопрос нет однозначного ответа. Разные API (и разные среды) будут иметь разные уровни многопоточности и безопасности.

0
ответ дан 4 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: