国产精品天干天干,亚洲毛片在线,日韩gay小鲜肉啪啪18禁,女同Gay自慰喷水

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

wait和fork在多線程程序中的注意事項

2023-02-11 18:58 作者:奧大梨呀  | 我要投稿

????我們都知道fork函數(shù)可以創(chuàng)建一個子進程,而其內(nèi)存資源是父進程的一個拷貝,比如打開的文件描述符,變量等都是和父進程一模一樣的,而wait函數(shù)則是父進程用于阻塞等待子進程的退出并且回收子進程的資源。

????但是如果執(zhí)行fork函數(shù)和wait函數(shù)的進程恰好是多線程程序又會怎么樣呢,最近在開發(fā)多進程程序的時候就遇到了這樣一個問題。

????當我們fork一個子進程時,如果父進程需要等待子進程退出后再繼續(xù),那么就需要調(diào)用wait函數(shù)阻塞父進程,可父進程是一個多線程程序呀,我們都知道進程是操作系統(tǒng)分配資源的最小單位,而線程是調(diào)度的最小單位,wait究竟會阻塞整個進程的所有線程還是只會阻塞調(diào)用wait的那個線程呢,這關(guān)系到父進程的其他線程的處理。經(jīng)過一系列實驗之后,我最終得出了結(jié)果,這里先貼出來:

????·fork函數(shù)fork出的子進程永遠是一個單線程進程,而且該線程對應(yīng)的是父進程中調(diào)用fork函數(shù)的線程。

????·wait函數(shù)僅會阻塞父進程中調(diào)用wait函數(shù)的線程,其余線程不會被wait阻塞。

????如果你想了解實驗過程的話,請繼續(xù)往下看。

????為了測試fork函數(shù)和wait函數(shù)對多線程進程的影響,我寫了以下程序:

代碼中關(guān)鍵的地方在于:父進程在主線程首先創(chuàng)建了一個線程1,然后再fork一個子進程。

????運行結(jié)果如下:

第一次實驗結(jié)果

從運行結(jié)果我們可以推理出2點:

????①從線程1中打印的進程ID消息來看,這個線程1屬于父進程,但沒有看到來自子進程的線程1消息,由此可以確定,子進程中沒有線程1在執(zhí)行,而父進程的線程1仍在執(zhí)行。

????②子進程打印完3次”child process msg”后,繼續(xù)打印了3次”main thread msg”后退出,而這時,因為子進程的退出導致父進程就緒,父進程繼續(xù)往下執(zhí)行打印3次”main thread msg”后退出。由此可以確定,子進程的主線程在執(zhí)行,而父進程的主線程被阻塞。

????以上2點可以說明,子進程只fork了父進程的主線程,父進程的主線程因為wait而被阻塞,但其線程1沒有被阻塞。

????到這里可以證明文章開頭的結(jié)論了嗎,不,還不行,我們只是證明了fork結(jié)論的前半句,wait結(jié)論的后半句。fork的子進程的線程對應(yīng)的是父進程的哪一個線程還無法證明,萬一不論怎樣都是fork父進程的主線程呢,同理wait也是,因此我們需要做第二個實驗。

????第二個實驗與第一個實驗大同小異,區(qū)別在于,父進程創(chuàng)建子進程的操作從父進程的主線程移動到了父進程的線程1中:

運行結(jié)果:

第二次實驗結(jié)果

從這個結(jié)果同樣也能看出2點:

????①通過打印的”thread 1 msg”后面的進程ID來看,這是子進程的線程1在執(zhí)行,但是沒有看到來自子進程的主線程消息,由此可以確定,子進程中沒有原本來自父進程的主線程。

????②通過打印的”main thread msg”后面的進程ID來看,這是父進程的主線程在執(zhí)行,而父進程的線程1由于調(diào)用了wait已經(jīng)被阻塞了。

????綜合兩次實驗結(jié)果,足夠確定開頭的結(jié)論是正確的了。因此在一些多線程程序中使用這兩個函數(shù)必須明確調(diào)用它們的線程以及對應(yīng)的處理方法。


wait和fork在多線程程序中的注意事項的評論 (共 條)

分享到微博請遵守國家法律
甘孜| 永康市| 钟山县| 兴化市| 安龙县| 延安市| 牡丹江市| 中江县| 昌黎县| 营口市| 江油市| 英吉沙县| 鄂尔多斯市| 长阳| 伊春市| 西平县| 织金县| 阿瓦提县| 天津市| 湖州市| 新乡县| 仁化县| 青神县| 毕节市| 库尔勒市| 阳泉市| 辽宁省| 乡宁县| 灵石县| 民和| 乌兰县| 祥云县| 上林县| 来凤县| 汕头市| 贵港市| 新余市| 新民市| 读书| 甘洛县| 武城县|