не хватает реализации atomic cas в std
есть кусок кода из статьи
int c;
if ((c = cmpxchg (val, 0, 1)) != 0) {
//something
}
// cmpxchg(var, old, new): The content of the variable var will be replaced with
// new if the current value is old. Regardless, the current value of var before the
// operation is returned.
в std отсутствует такая реализация CAS инструкции...
Попытался проэмулировать таким куском кода:
std::uint32_t с = 0;
if ((с = std::atomic_compare_exchange_strong(&val, &c, 1) ? 0 : 1) != 0) {
//something
}
насколько это корректно?
EDIT: с учетом ответа
std::uint32_t с = 0;
if (!std::atomic_compare_exchange_strong(&val, &c, 1)) {
//something
}
Ответы (1 шт):
С виду корректно (хоть и криво), но можно проще:
std::uint32_t с = 0;
if (!std::atomic_compare_exchange_strong(&val, &c, 1)) {
//something
}
так у вас с не присвоена, в итоге.
atomic_compare_exchange_strong() сам меняет значения переменных местами и возвращает старое значение в отличии от cmpxchg(), который, судя по использованию, только присваивает переменной новое значение (при условии, что старое не изменилось) и возвращает старое значение. Явно присваивать значение с в таком случае не нужно, и, вероятно, не правильно.
но больше интересовало _weak/_strong... будет ли разница
Скорей всего, *_strong в данном контексте предпочтительнее, но что именно использовать зависит от алгоритма: atomic_compare_exchange_weak() в отличии от *_strong может не произвести обмен даже если значение переменной было равно старому и вернуть false.
На x86, если что, разницы нет.