Каков объем памяти std :: atomic в C ++ 11 на практике? - PullRequest
0 голосов
/ 28 мая 2018

Программа, которую я пишу, должна хранить значительные объемы данных (несколько гигабайт) в оперативной памяти, чтобы к ней атомарно обращались многие потоки.std::atomic кажется разумным способом сделать это, потому что его доступы, вероятно, будут более эффективными, чем упаковка всех обращений в один или несколько std::mutex с, поскольку в худшем случае он будет использовать мьютекс внутри и быть эквивалентным.

Мои данные организованы как набор Chunk объектов, которые, среди прочего, имеют элемент массива, содержащий большую часть их данных.Сейчас я думаю об определении его как std::array<std::atomic<unsigned int>, SOME_CONSTANT_HERE>, но это будет эффективно только в том случае, если объем памяти std::atomic на встроенных типах, таких как unsigned int, не хуже, чем unsigned int, дляИсходя из моих расчетов, с объемом данных, которые мне нужно хранить, текущие общие возможности оперативной памяти едва достаточны.

Единственная альтернатива, которую я вижу (другие альтернативы приветствуются), состоит в том, чтобы каждый блок имел свойstd::mutex, но это проблематично, потому что часто потоки должны будут работать с несколькими чанками одновременно (однако, не со всеми), а удержание нескольких блокировок является проблематичным для взаимоблокировок и приведет к значительному конфликту из-за шаблоновиз которых куски доступны через различные потоки.

Итак, каков объем памяти на практике для x86_64 std::atomic для целочисленных типов?

РЕДАКТИРОВАТЬ: я пытался искать в Google и даже немного копаться в стандарте GNUисходный код библиотеки, безрезультатно.

Ответы [ 2 ]

0 голосов
/ 28 мая 2018

Вы можете проверить это самостоятельно здесь: https://godbolt.org/g/6zjJCU - без оптимизации включена, и std::atomic, и обычная переменная занимают одинаковое количество памяти.

Однако разница в том, чтодоступ к переменным.Попробуйте раскомментировать блок ... вы получаете все статические вызовы и защиту данных.

Если вы выполняете много операций чтения / записи, мьютекс может быть более эффективным - может быть, вы можете заблокировать мьютекс и затем прочитать, скажем, 100 байт данных?Кроме того, будьте осторожны с грязными операциями чтения / записи: если вы читаете атомарное, что-то делаете со значением, а затем пытаетесь обновить атомарное, чередующийся поток, возможно, уже изменил значение атомарного.Этого можно легко избежать с помощью немного более дорогого мьютекса.

0 голосов
/ 28 мая 2018

Согласно эта ссылка atomic имеет один элемент типа шаблона.Он также имеет специализацию для unsigned int, хотя и не обеспечивает такого большого эффекта над базовым типом.С памятью у тебя должно быть все в порядке.

...