Как можно использовать std :: atomic_compare_exchange_ * и т. Д. С произвольными указателями?

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 собирается решить это.

4

Решение

Краткий ответ: они не могут. Это необходимо для переносимости языка, поскольку C ++ не хочет требовать, чтобы каждая платформа имела поддержку без блокировки для определенного набора размеров данных. С помощью std::atomic<T> облегчает для библиотеки прозрачное обеспечение атомарности без блокировки для некоторых Tи использовать замок для других.

С другой стороны, замена T с atomic<T> в вашей кодовой базе содержится документация о том, какие именно объекты используются для синхронизации, и обеспечивается защита от случайного неатомарного доступа к этим объектам.

Длинный ответ: reinterpret_cast<std::atomic<decltype(t)>&>(t).store(value) может на самом деле работать над некоторыми реализациями во время правильной фазы луны, но это самое чистое зло.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]