Accoding到cppreference.com之前修改共享的「原子」變量:爲什麼我需要獲得鎖的通知condition_variable
是打算修改變量有
- 獲得線程std :: mutex(通常通過std :: lock_guard)
- 執行修改,同時鎖定被鎖定
- 對std :: condition_variable執行notify_one或notify_all(鎖定不需要舉行通知)
即使共享變量是原子的,它必須在互斥量下修改才能正確地將修改發佈到等待線程。
我不太明白,爲什麼修改一個原子變量需要一個鎖。請看下面的代碼片段:
static std::atomic_bool s_run {true};
static std::atomic_bool s_hasEvent {false};
static std::mutex s_mtx;
static std::condition_variabel s_cv;
// Thread A - the consumer thread
function threadA()
{
while (s_run)
{
{
std::unique_lock<std::mutex> lock(s_mtx);
s_cv.wait(lock, [this]{
return m_hasEvents.load(std::memory_order_relaxed);
});
}
// process event
event = lockfree_queue.pop();
..... code to process the event ....
}
}
// Thread B - publisher thread
function PushEvent(event)
{
lockfree_queque.push(event)
s_hasEvent.store(true, std::memory_order_release);
s_cv.notify_one();
}
在PushEvent功能,我不掌握s_mtx因爲s_hasEvent是一個原子變量,隊列lockfree。沒有獲取s_mtx鎖定的問題是什麼?
條件變量是共享狀態,因此必須由互斥鎖保護。 –
問題是關於通過互斥體(也是共享狀態)而不是condvar保護's_hasEvents'。發佈者不會修改condvar,它只會調用'notify_one()',這在互斥鎖被鎖定時不需要完成。 –