Explorar el Código

解决几处可能错误使用compare exchange weak的地方

tags/v2.9.7
tearshark hace 4 años
padre
commit
cd8f6adb7e
Se han modificado 2 ficheros con 4 adiciones y 4 borrados
  1. 3
    3
      librf/src/event_v2.cpp
  2. 1
    1
      librf/src/spinlock.h

+ 3
- 3
librf/src/event_v2.cpp Ver fichero

void state_event_t::on_cancel() noexcept void state_event_t::on_cancel() noexcept
{ {
bool* oldValue = _value.load(std::memory_order_acquire); bool* oldValue = _value.load(std::memory_order_acquire);
if (oldValue != nullptr && _value.compare_exchange_weak(oldValue, nullptr, std::memory_order_acq_rel))
if (oldValue != nullptr && _value.compare_exchange_strong(oldValue, nullptr, std::memory_order_acq_rel))
{ {
*oldValue = false; *oldValue = false;
this->_coro = nullptr; this->_coro = nullptr;
bool state_event_t::on_notify() bool state_event_t::on_notify()
{ {
bool* oldValue = _value.load(std::memory_order_acquire); bool* oldValue = _value.load(std::memory_order_acquire);
if (oldValue != nullptr && _value.compare_exchange_weak(oldValue, nullptr, std::memory_order_acq_rel))
if (oldValue != nullptr && _value.compare_exchange_strong(oldValue, nullptr, std::memory_order_acq_rel))
{ {
*oldValue = true; *oldValue = true;


bool state_event_t::on_timeout() bool state_event_t::on_timeout()
{ {
bool* oldValue = _value.load(std::memory_order_acquire); bool* oldValue = _value.load(std::memory_order_acquire);
if (oldValue != nullptr && _value.compare_exchange_weak(oldValue, nullptr, std::memory_order_acq_rel))
if (oldValue != nullptr && _value.compare_exchange_strong(oldValue, nullptr, std::memory_order_acq_rel))
{ {
*oldValue = false; *oldValue = false;



+ 1
- 1
librf/src/spinlock.h Ver fichero

bool try_lock() noexcept bool try_lock() noexcept
{ {
int val = FREE_VALUE; int val = FREE_VALUE;
bool ret = lck.compare_exchange_weak(val, LOCKED_VALUE, std::memory_order_acq_rel);
bool ret = lck.compare_exchange_strong(val, LOCKED_VALUE, std::memory_order_acq_rel);
#if _DEBUG #if _DEBUG
if (ret) owner_thread_id = std::this_thread::get_id(); if (ret) owner_thread_id = std::this_thread::get_id();

Cargando…
Cancelar
Guardar