memcpy () безопасность в смежных областях памяти - PullRequest
5 голосов
/ 14 января 2011

Я недавно задал вопрос о с использованием volatile и получил указание прочитать некоторые очень информативные статьи от Intel и других, в которых обсуждались барьеры памяти и их использование.После прочтения этих статей я стал совершенно параноиком.

У меня 64-битный компьютер.Безопасно ли записывать в смежные неперекрывающиеся области памяти из нескольких потоков?Например, скажем, у меня есть буфер:

char buff[10];

Безопасно ли всегда для одного потока memcpy в первые 5 байтов, а второй поток копирует в последние 5 байтов?

Моя внутренняя реакция (и некоторые простые тесты) показывают, что это абсолютно безопасно, но я нигде не смог найти документацию, которая могла бы меня полностью убедить.

Ответы [ 4 ]

7 голосов
/ 14 января 2011

Сейф, да.Performant, по крайней мере, в этом ограниченном примере.Помните, что одна строка кэша не может быть в двух ядрах одновременно.Вы заставите ядро ​​A ждать, пока ядро ​​B выполнит запись в буфер, а затем подождать, пока память будет передана, и затем выполнить запись в него.Чтобы избежать этого эффекта, многоядерные копии памяти должны быть очень большими по размеру.

4 голосов
/ 14 января 2011

Да, это абсолютно безопасно, сериализация доступа к шине памяти производится аппаратно.

2 голосов
/ 14 января 2011

Пока каждый экземпляр memcpy полагает, что записывает только в свою часть буфера, он полностью безопасен. Распределения массива любой формы в C ++ очень низкоуровневые; это непрерывный блок памяти, выделенный для программы соответствующего размера, а массив как объект, который существует как что-либо, кроме указателя, - просто иллюзия. Дайте memcpy непересекающиеся диапазоны массива, и он не сможет узнать, что это не просто два совершенно разных массива, которые просто оказываются смежными друг с другом. Записи не будут мешать.

0 голосов
/ 14 января 2011

Да, это абсолютно не связано ни с каким случаем - перед заказом.это просто копирование байтов вокруг.

...