могут ли потоки бороться за доступ к одному адресу? - PullRequest
1 голос
/ 21 октября 2010

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

Ответы [ 4 ]

3 голосов
/ 21 октября 2010

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

Это зависит от рассматриваемой архитектуры и языка.На практике это обычно означает, что у вас будет условие состязания, а значение «чтение» может быть старым или новым значением.

Более интересно, если два потока пытаются записать в одну и ту же переменную одновременновремя - если один пишет false, а другой true, фактическая результирующая переменная может заканчиваться любым значением.

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

Кроме того, если переменная запись не является отдельной инструкцией ЦП (т. Е. Используется блокируемая операция или аналогичная), необходимо позаботиться о явной синхронизации доступа для чтения и записи, иначе вы можете (включитьнекоторые архитектуры) получают переменную в третьем неопределенном состоянии.

2 голосов
/ 21 октября 2010

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

edit

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

1 голос
/ 21 октября 2010

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

. Проверьте .Net framework Класс блокировки или API-интерфейсы Interlocked * в Win32 .

0 голосов
/ 21 октября 2010

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

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