您好,登錄后才能下訂單哦!
這篇文章主要講解了“C++為什么不要在線程中無條件等待”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“C++為什么不要在線程中無條件等待”吧!
CP.42:不要無條件等待
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ù)等待。
Flag all waits without conditions.
標(biāo)記所有無條件等待。
感謝各位的閱讀,以上就是“C++為什么不要在線程中無條件等待”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對C++為什么不要在線程中無條件等待這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(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)容。