Недавно я задал вопрос о using volatile и получил информативные статьи от Intel и другие, в которых обсуждались барьеры памяти и их использование. После прочтения этих статей я стал довольно параноидальным.Безопасность memcpy() в смежных областях памяти
У меня 64-разрядная машина. Безопасно ли memcpy в соседние, неперекрывающиеся области памяти из нескольких потоков? Например, скажем, у меня есть буфер:
char buff[10];
ли это всегда безопасно для одного потока к тетсру в первые 5 байт, а второй поток копирует в последние 5 байт?
Моя реакция кишки (и некоторые простые тесты) показывают, что это абсолютно безопасно, но я не смог найти документацию в любом месте, где можно полностью убедить меня.
Это зависит от процессора, если память была объявлена изменчивой, и уровня оптимизации компилятора. Как правило, каждое ядро будет записывать в свою собственную копию кеша, которую процессор будет решать позже во время последующего сброса. Это приводит к тому, что реальный барьер синхронизации памяти полностью необходим, чтобы получить детерминированное поведение из-за того, что он действительно пытался прочитать записанную память. –
x86/x64 и многие другие процессоры являются кеш-когерентными (http://en.wikipedia.org/wiki/Cache_coherency). Два ядра могут содержать одну и ту же строку кэша, и обе копии всегда будут обновляться, чтобы они сохраняли одно и то же значение. Конечно, как и сказано, доступ к одной и той же линии кэширования из двух ядер оказывает огромное влияние на производительность. – Timo
@ Адам: К счастью, меня беспокоит только письмо - любые чтения будут происходить далеко в будущем. В противном случае я, вероятно, был бы еще более параноидальным. – JaredC