這篇文章主要講解了“C++為什么不要在線程中無條件等待”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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.
無條件等待可能錯過喚醒,也可能喚醒之后發現無事可做。
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會永遠等待。
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.
現在,當某個線程執行get喚醒時,如果隊列為空(例如,由用戶另外的線程已經事先執行了get),它會立刻回到休眠狀態繼續等待。
Flag all waits without conditions.
標記所有無條件等待。
感謝各位的閱讀,以上就是“C++為什么不要在線程中無條件等待”的內容了,經過本文的學習后,相信大家對C++為什么不要在線程中無條件等待這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。