溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C++為什么不要在線程中無條件等待

發(fā)布時間:2021-11-25 15:49:57 來源:億速云 閱讀:104 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要講解了“C++為什么不要在線程中無條件等待”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++為什么不要在線程中無條件等待”吧!

CP.42:不要無條件等待

Reason(原因)

A wait without a condition can miss a wakeup or wake up simply to find that there is no work to do.

無條件等待可能錯過喚醒,也可能喚醒之后發(fā)現(xiàn)無事可做。

Example, bad(反面示例)

std::condition_variable cv;std::mutex mx;
void thread1(){    while (true) {        // do some work ...        std::unique_lock<std::mutex> lock(mx);        cv.notify_one();    // wake other thread    }}
void thread2(){    while (true) {        std::unique_lock<std::mutex> lock(mx);        cv.wait(lock);    // might block forever        // do work ...    }}

Here, if some other thread consumes thread1's notification, thread2 can wait forever.

這里,如果某個另外的線程消耗了線程1的通知,線程2會永遠(yuǎn)等待。

Example(示例)

template<typename T>class Sync_queue {public:    void put(const T& val);    void put(T&& val);    void get(T& val);private:    mutex mtx;    condition_variable cond;    // this controls access    list<T> q;};
template<typename T>void Sync_queue<T>::put(const T& val){    lock_guard<mutex> lck(mtx);    q.push_back(val);    cond.notify_one();}
template<typename T>void Sync_queue<T>::get(T& val){    unique_lock<mutex> lck(mtx);    cond.wait(lck, [this] { return !q.empty(); });    // prevent spurious wakeup    val = q.front();    q.pop_front();}

Now if the queue is empty when a thread executing get() wakes up (e.g., because another thread has gotten to get() before it), it will immediately go back to sleep, waiting.

現(xiàn)在,當(dāng)某個線程執(zhí)行g(shù)et喚醒時,如果隊列為空(例如,由用戶另外的線程已經(jīng)事先執(zhí)行了get),它會立刻回到休眠狀態(tài)繼續(xù)等待。

Enforcement(實施建議)

Flag all waits without conditions.

標(biāo)記所有無條件等待。

感謝各位的閱讀,以上就是“C++為什么不要在線程中無條件等待”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C++為什么不要在線程中無條件等待這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI