В соответствии со статьей о IBM.com, "состояние состязания является ситуацией, в которой два или больше потока или процессы читают или пишут некоторые совместно используемые данные, и конечный результат зависит от синхронизации того, как потоки планируются. Условия состязания могут привести к непредсказуемым результатам и тонким ошибкам программы".. Хотя статья касается Java, мне в целом преподавали то же определение.
Насколько я знаю, простая операция чтения из RAM состоит из установки состояний определенных входных строк (адрес, читайте и т.д.), и чтение состояний выходных строк. Это - операция, которая, очевидно, не может быть выполнена одновременно двумя устройствами и должна быть сериализирована.
Теперь давайте предположим, что у нас есть ситуация, когда несколько потоков получают доступ к объекту в памяти. В теории этот доступ должен быть сериализирован для предотвращения условий состязания. Но например, алгоритм читателей/устройств записи предполагает, что произвольное число читателей может использовать общую память одновременно.
Так, вопрос: нужно реализовать монопольную блокировку для чтения при использовании многопоточности (в WinAPI, например)? В противном случае, почему? Где это управление реализовано - ОС, аппаратные средства?
С наилучшими пожеланиями, Kuba
Чтение памяти на аппаратном уровне выполняется последовательно - вам не нужно беспокоиться о параллелизме на этом уровне.Два потока выдают инструкции чтения и все необходимое - установка адресов на адресной шине и фактическое чтение осуществляются аппаратным обеспечением доступа к памяти таким образом, что чтение всегда будет работать правильно.
На самом деле то же самое верно и для сценариев чтения / записи, за исключением того, что при чередовании запросов на чтение и запись вы получите разные результаты в зависимости от времени, и именно поэтому вам нужна синхронизация.
Пока данные ничего не меняют, их можно читать из нескольких потоков совершенно безопасно. Даже если два процессора (или ядра) стремятся получить доступ к памяти для чтения в одном и том же тактовом цикле, их обращения будут сериализованы контроллером памяти, и они не будут мешать друг другу. Эта функция важна для правильной работы аппаратного обеспечения.
На этот вопрос нет однозначного ответа. Разные API (и разные среды) будут иметь разные уровни многопоточности и безопасности.