С std::atomic
Кажется, не существует никакого совместимого со стандартами способа иногда читать / писать без атомарности. Boost блокирует операции, но они находятся в details
пространство имен, поэтому я не думаю, что я должен его использовать. Но я не знаю всего о повышении. Есть ли что-то в boost или stl, что я мог бы использовать? Или, возможно, предложение, которое решит эту проблему, например, добавив std::memory_order_no_synchronization
? Или получить доступ к абстракции заблокированного механизма?
Кажется, что потребность в этом появится во многих проектах. Объекты, которые требуют поточной безопасности, могут временно содержаться в однопоточном контексте, что делает атомарный доступ излишним. Например, при первом создании объекта он обычно будет виден только в потоке, создающем его, до тех пор, пока не будет размещен где-нибудь доступным для нескольких потоков. Пока ваш объект доступен только одному потоку, вам не понадобится std::atomic
безопасность вообще. Но когда все будет готово, вы опубликуете его в других потоках, и вдруг вам понадобится блокировка и принудительный атомарный доступ.
В этом конкретном приложении я строю большие безблокировочные деревья. Во время построения просто нет необходимости в блокировке, поэтому существующий проект (который вызывает предоставляемые os блокированные функции) не использует блокировку до тех пор, пока это не станет необходимым. После того, как это становится видимым для других потоков, все потоки должны использовать взаимосвязанное представление. Я не могу портировать на std::atomic
не вводя кучу бессмысленной синхронизации.
Лучшее, о чем я могу думать сейчас, — это использовать std::memory_order_relaxed
, но в ARM это все еще не то же самое, что неатомарный доступ. На x86 / amd64 это все же. Еще один взлом — размещение новых на std::atomic
, который записывает новое значение без атомарности, но не обеспечивает никакого способа считывания значения неатомно.
Задача ещё не решена.