Я открываю файл, используя библиотеку форматированных карт. Можно ли использовать «fetch_add» (значение считывается в определенной позиции, затем добавляется другим и записывается обратно в ту же самую позицию атомарно) в этом отображаемом файле?C++: Fetch_add в файле с отображением памяти
Если несколько потоков записи в него параллельно могут возникнуть проблемы без атомарностью участие
Файл находится в двоичном формате и содержит Интс или двойники (зависит от конкретного файла).
Я также пробовал блокировки/мьютексы, но они всегда замедляют мою программу при использовании нескольких потоков. Время, проведенное в заблокированных областях, просто велико по сравнению с остальной частью алгоритма, и потоки блокируют друг друга.
Есть ли какие-либо улучшения, чтобы несколько потоков могли записывать в сопоставленный файл с высокой производительностью?
Спасибо. Laz
Существует только несколько потоков, обращающихся к отображению. Итак, std :: atomic - это просто для одиночных значений, и нет возможности сделать блок памяти атомарным, например массив. За исключением того, что каждый элемент представляет собой атомное одиночное значение? Не учитывая специфику платформы. Спасибо за быстрый ответ! – Lazarus535
виртуальный +1 для __sync_fetch_and_add! Слишком низкая репутация еще :-( – Lazarus535
@ Lazarus535: 'std :: atomic' - это шаблон, поэтому теоретически вы можете иметь атомную переменную любого типа, включая массив или большую структуру. Однако [только определенные специализации блокируются -free] (http://en.cppreference.com/w/cpp/atomic/atomic/is_lock_free) (в идеале все те аппаратные средства, которые поддерживаются с учетом эффективной реализации стандартной библиотеки), и атомарность достигается посредством нормального mutex (внутренний для реализации) для всех других типов. Обратите также внимание на то, что массив атомных переменных не является тем же самым, что и атомная переменная, содержащая массив :-) – Cameron