最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(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ù)塊都準備好。

等待事件的評論 (共 條)

分享到微博請遵守國家法律
平湖市| 正宁县| 砚山县| 玉田县| 临夏市| 绥德县| 曲麻莱县| 莱芜市| 哈巴河县| 盘山县| 武川县| 京山县| 金门县| 长子县| 和平区| 温宿县| 阜城县| 孙吴县| 石河子市| 明光市| 泉州市| 齐河县| 古丈县| 阳东县| 南澳县| 东乡族自治县| 开封市| 始兴县| 兴义市| 忻城县| 武汉市| 吴堡县| 永靖县| 河源市| 五莲县| 遂平县| 白城市| 蓬安县| 平罗县| 武定县| 平泉县|