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