Операция CAS, которая записывает то же значение, обеспечивает правильную логику?C++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Операция CAS, которая записывает то же значение, обеспечивает правильную логику?

Сообщение Anonymous »

Существует сценарий, в котором нажимает кнопку каждый раз, когда отправляет сетевой запрос и использует только результат недавнего запроса. Для достижения этой логики я использую атомный объект для записи версии запроса; Только версия, результат соответствует равным текущей версии, можно использовать результат. < /p>

Код: Выделить всё

atomic version = {0};

// Button Click handler
void OnClick(){
auto v = version.fetch_add(1,memory_order​::​acq_rel); // #1
std::thread([v](){
int current = v+1;
auto r = network_request(current ); // #2
if(version.compare_exchange_strong(current,current,memory_order::release,memory_order::relaxed)){ // #3
use_req(r);
}
});
}
Теперь существуют два события щелчков: A и B. A происходит до B (вовремя). Если #3 в заказывается после #1 в b , результат запроса в игнорируется. Напротив, если #3 в заказано до #1 в B , операция CAS в будет успешно, его результат будет использоваться, то #1 в b будет считывать значение, написанное #3 в , который также предоставляет сетевой запрос в before, что в b . В этом случае предполагая, что функция use_req является потоковым. Можно ли просто быть установлена ​​операция CAS для загрузки? B триггеры, и его fetch_add читает модификацию, созданную A #1 , a #3 должен сбой, согласно Atomics.order P10

Атомная рецидива-рецидив Операция. Если CAS в случае A преуспел и был операцией RMW, P10 будет нарушен. Таким образом, проверка условия в случае A гарантированно обнаружит изменение версии в этом случае.
В отличие от, если #3 является чистой нагрузкой, хотя #1 в случае b читает изменение, произведенную по #1 event , согласно Intro.races p14 p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> p> P14 p14 , #3

Подробнее здесь: https://stackoverflow.com/questions/795 ... rect-logic
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»