InterlockedCompareExchange
в Windows, а также __sync_val_compare_and_swap
в gcc взять указатели, и поэтому я могу перейти на любой адрес, например указывая на блок общей памяти в эти функции.
Для архитектур, отличных от x86, мне может потребоваться обеспечить выравнивание памяти для корректности, а для x86 (и, возможно, для других) я могу захотеть обеспечить выравнивание строк кэша для производительности, хотя правильность не должна быть проблемой (-> x86 LOCK
префикс).
Пытаясь избавиться от некоторых платформо-зависимых вещей в моем коде (Windows VC ++ и GCC), я взглянул на C ++ 11 atomic_compare_exchange_weak
и друзья. Но все они работают с переменной типа std::atomic<T>*
,
Есть ли способ использовать произвольные указатели с атомарными функциями C ++ 11? Это не похоже на простое приведение к std :: atomic собирается решить это.
Краткий ответ: они не могут. Это необходимо для переносимости языка, поскольку C ++ не хочет требовать, чтобы каждая платформа имела поддержку без блокировки для определенного набора размеров данных. С помощью std::atomic<T>
облегчает для библиотеки прозрачное обеспечение атомарности без блокировки для некоторых T
и использовать замок для других.
С другой стороны, замена T
с atomic<T>
в вашей кодовой базе содержится документация о том, какие именно объекты используются для синхронизации, и обеспечивается защита от случайного неатомарного доступа к этим объектам.
Длинный ответ: reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value)
может на самом деле работать над некоторыми реализациями во время правильной фазы луны, но это самое чистое зло.
Других решений пока нет …