Вызывает ли параллельный доступ к памяти READ / WRITE ошибки / нарушения? - PullRequest
1 голос
/ 01 июля 2011

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

Что, если два потока не только читают, но также пишут и комбинируют чтение и запись (скажем, поток 1 пытается читать одновременно с тем, как поток 2 пытается записать, или если оба пытаются записатьв то же время).Это вызовет ошибку / BSOD / AV, или единственная проблема, что поведение не определено?(что один из потоков получит неверные данные, в зависимости от фактического времени)

1 Ответ

0 голосов
/ 02 июля 2011

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

2) Любое ядро ​​ЦП имеет собственный кеш, а данные сначала копируются и затем изменяются в строке кеша, после чегоскопировано в соответствующее (непредсказуемое) время обратно в ОЗУ.Существуют специальные инструкции процессора (например, блокировка), которые должны выполняться вместе с другими инструкциями (например, cmpxchg) для обеспечения чтения, записи или изменения атомарной памяти ( interlocked ), некоторые инструкции по умолчанию являются атомарными.

Помните: атомный (блокированный) доступ к ОЗУ может иметь длину всего 1, 2, 4 или 8 (и 16 при 64-битном ЦП).Для более длинных структур памяти вы должны обеспечить соответствующий механизм блокировки (синхронизации), такой как Критический раздел , чтобы избежать неконтролируемого доступа к памяти несколькими потоками.

...