五月天青色头像情侣网名,国产亚洲av片在线观看18女人,黑人巨茎大战俄罗斯美女,扒下她的小内裤打屁股

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

等待事件

2023-07-05 21:40 作者:追逐彗星的尾巴  | 我要投稿

條件變量(condition variable)

當一個線程等待另一個線程完成任務時,一種最基本的喚醒方式是通過另一線程觸發(fā)等待事件,這種機制就稱為“條件變量”。當某些線程被終止時,為了喚醒等待線程,終止線程將會向等待著的線程廣播“條件達成”的信息.

Case

首先,有一個用來在兩個線程之間傳遞數(shù)據(jù)的隊列。當數(shù)據(jù)準備好時,使用std::lock_guard對隊列上鎖,將數(shù)據(jù)壓入隊列中。再調(diào)用std::condition_variablenotify_one成員函數(shù),對等待的線程(如果有等待線程的話)進行通知。另外一側(cè),有一個正在處理數(shù)據(jù)的線程,這個線程首先對互斥量上鎖,之后會調(diào)用std::condition_variable的成員函數(shù)wait,傳遞一個unique_lock和一個謂詞(只有當謂詞為false時才進入等待狀態(tài),否則立刻退出wait函數(shù),接著執(zhí)行下面的語句。進入等待狀態(tài)后,wait首先會釋放鎖,并阻塞當前線程,直到被notify_onenotify_all喚醒;被喚醒后,鎖會再次被鎖定,wait函數(shù)退出)。當prepareData線程調(diào)用notify_one,通知條件變量condition時,processData線程會從睡眠(等待)狀態(tài)中蘇醒。

線程安全的隊列

wait_and_pop函數(shù)中,如果隊列為空,線程將被阻塞,直到隊列中有值可用。wait_and_poptry_pop函數(shù)都有一個返回shared_ptr的重載,目的是確保在多線程環(huán)境中安全地共享所有權(quán)。當一個線程調(diào)用wait_and_poptry_pop函數(shù)來彈出隊列的值時,該值的所有權(quán)會被轉(zhuǎn)移給該線程,其他線程不能再訪問該值。通過使用shared_ptr,多個線程可以共享隊列中的值,同時保證在所有線程都完成對值的使用后,值的內(nèi)存會自動釋放。

一些不足

在等待線程調(diào)用條件變量的等待操作后,如果條件為true,那么線程將不再等待條件變量,而是繼續(xù)執(zhí)行后續(xù)的代碼。這意味著條件變量的等待操作只能觸發(fā)一次等待過程。因此,一個條件變量可能不是同步機制的最佳選擇。

另外,條件變量的等待操作只能等待一個條件的滿足,而不能等待一組條件的同時滿足。例如,在需要等待多個數(shù)據(jù)塊都準備好的情況下,條件變量的使用可能會導致問題。當其中一個數(shù)據(jù)塊準備好時,等待線程被喚醒,但其他數(shù)據(jù)塊仍未準備好,等待線程卻會繼續(xù)執(zhí)行,而不是等待全部數(shù)據(jù)塊都準備好。

等待事件的評論 (共 條)

分享到微博請遵守國家法律
蒙城县| 兴海县| 隆回县| 潜山县| 六盘水市| 泰州市| 乌海市| 黄骅市| 辽阳县| 磐石市| 广昌县| 枞阳县| 常山县| 鄢陵县| 英山县| 濮阳县| 建瓯市| 五常市| 阿拉善左旗| 石屏县| 湄潭县| 化州市| 瑞昌市| 凉城县| 石泉县| 资中县| 铅山县| 永吉县| 乡宁县| 弥勒县| 简阳市| 庐江县| 且末县| 太康县| 米易县| 万安县| 大埔区| 兖州市| 刚察县| 上杭县| 隆林|