Программа, которую я пишу, должна хранить значительные объемы данных (несколько гигабайт) в оперативной памяти, чтобы к ней атомарно обращались многие потоки.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исходный код библиотеки, безрезультатно.