не хватает реализации 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 шт):

Автор решения: Fat-Zer

С виду корректно (хоть и криво), но можно проще:

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, если что, разницы нет.

→ Ссылка