亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 學院 > 操作系統 > 正文

進程控制之競爭條件

2024-06-28 13:28:35
字體:
來源:轉載
供稿:網友
進程控制之競爭條件

當多個進程都企圖對共享數據進行某種處理,而最后的結果又取決于進程運行的順序時,則我們認為這發生了競爭條件(race condition)。如果在fork之后的某種邏輯顯式或隱式地依賴于在fork之后是父進程先運行還是子進程先運行,那么fork函數就會是競爭條件活躍的滋生地。通常,我們不能預料哪一個進程先運行。即使知道哪一個進程先運行,那么在該進程開始運行后,所發生的事情也依賴于系統負載以及內核的調度算法。

如果一個進程希望等待一個子進程終止,則它必須調用一種wait函數。如果一個進程要等待其父進程終止,則可使用下列形式的循環:

while ( getppid() != 1 )    sleep( 1 );

這種形式的循環(稱為輪詢(polling))的問題是它浪費了CPU時間,因為調用者每隔1秒都被喚醒,然后再進行條件測試。

為了避免競爭條件和輪詢,在多個進程之間需要有某種形式的信號發送和接收的方法。在UNIX中可以使用信號機制。也可使用各種形式的進程間通信(ipC)。

在父、子進程的關系中,常常出現下述情況:在調用fork之后,父、子進程都有一些事情要做。假如,要求每個進程在執行完它的一套初始化操作后要通知對方,并且在繼續運行之前,要等待另一方完成其初始化操作。這種方案可以用代碼描述如下:

#include "apue.h"TELL_WAIT();    /* set things up for TELL_xxx & WAIT_xxx */if ((pid = fork()) < 0){    err_sys("fork error");}else if (pid == 0)    /* child */{    /* child does whatever is necessary ... */    TELL_PARENT( getppid() );    /* tell parent we're done */    WAIT_PARENT();               /* and wait for parent */    /* and the child continue on its way ... */    exit( 0 );}/* parent does whatever is necessary ... */TELL_CHILD( pid );        /* tell child we're done */WAIT_CHILD();             /* and wait for child *//* and the parent continues on its way ... */exit( 0 );

假定在頭文件apue.h中定義了各個需要使用的變量。5個例程TELL_WAIT、TELL_PARENT、TELL_CHILD、WAIT_PARENT以及WAIT_CHILD可以是宏,也可以是函數。(TELL、WAIT的實現方法http://www.CUOXin.com/nufangrensheng/p/3516427.html)

程序清單8-6輸出兩個字符串:一個由子進程輸出,另一個由父進程輸出。因為輸出依賴于內核使這兩個進程運行的順序及每個進程運行的時間長度,所以該程序包含了一個競爭條件。

程序8-6 具有競爭條件的程序

[root@localhost apue]# cat PRog8-6.c#include "apue.h"static void charatatime(char *);intmain(void){        pid_t   pid;        if((pid = fork()) < 0)        {                err_sys("fork error");        }        else if(pid == 0)        {                charatatime("output from child/n");        }        else        {                charatatime("output from parent/n");        }        exit(0);}static voidcharatatime(char *str){        char    *ptr;        int     c;        setbuf(stdout, NULL);   /* set unbuffered */        for(ptr = str; (c = *ptr++) != 0; )                putc( c, stdout );}

在程序中將標準輸出設置為不帶緩沖的,于是每個字符輸出到需調用一次write。本例的目的是使內核盡可能地在兩個進程之間進行多次切換,以便演示競爭條件。

[root@localhost apue]# ./prog8-6output from poutput from childarent[root@localhost apue]# ./prog8-6output from childoutput from parent

修改程序清單8-6,以使用TELL和WAIT函數,于是形成了程序清單8-7.行首標以+號的行是新增的行。

程序清單8-7 修改程序清單8-6以避免競爭條件

#include "apue.h"static void charatatime(char *);intmain(void){        pid_t   pid;+      TELL_WAIT();+        if((pid = fork()) < 0)        {                err_sys("fork error");        }        else if(pid == 0)        {+              WAIT_PARENT();    /* parent goes first */                charatatime("output from child/n");        }        else        {                charatatime("output from parent/n");+    TELL_CHILD( pid );        }        exit(0);}static voidcharatatime(char *str){        char    *ptr;        int     c;        setbuf(stdout, NULL);   /* set unbuffered */        for(ptr = str; (c = *ptr++) != 0; )                putc( c, stdout );}

運行此程序則能得到所預期的輸出;兩個進程的輸出不再交叉混合。

程序清單8-7是使父進程先運行。如果將fork之后的行改變成:

else if(pid == 0){        charatatime("output from child/n");        TELL_PARENT( getppid() );}else{        WAIT_CHILD();    /* child goes first */        charatatime("output from parent/n");}

則子進程先運行。

本篇博文內容摘自《UNIX環境高級編程》(第二版),僅作個人學習記錄所用。關于本書可參考:http://www.apuebook.com/。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日本一区二三区好的精华液| 海角国产乱辈乱精品视频| 欧美性猛交xxxx偷拍洗澡| 久久国产精彩视频| 国产v综合ⅴ日韩v欧美大片| 国产精品xxxxx| 91av福利视频| 九九热这里只有在线精品视| 亚洲精品视频免费在线观看| 久久色精品视频| 97**国产露脸精品国产| 亚洲一区二区久久久久久久| 中文字幕亚洲欧美日韩高清| 最近2019中文字幕大全第二页| 日本精品久久久| 亚洲人成在线观| 亚洲成人黄色在线| 亚洲福利在线看| 精品久久久久久久大神国产| 中日韩午夜理伦电影免费| 亚洲图片欧美午夜| 亚洲国产第一页| 国产精品欧美激情在线播放| 九九九久久久久久| 高潮白浆女日韩av免费看| 欧美性受xxxx黑人猛交| 精品日韩美女的视频高清| 成人激情视频免费在线| 欧美午夜精品伦理| 国产91精品久久久久久久| 91久久综合亚洲鲁鲁五月天| 中文字幕亚洲综合| 亚洲精品理论电影| 国产在线拍偷自揄拍精品| 国产亚洲一区二区在线| 日韩人体视频一二区| 91福利视频网| 九九视频这里只有精品| 亚洲美女av网站| 亚洲曰本av电影| 亚洲va欧美va国产综合久久| 超碰日本道色综合久久综合| 久久成人精品电影| 欧美日韩国产中文精品字幕自在自线| 亚洲天堂网站在线观看视频| 国产精品对白刺激| 国产日韩欧美在线视频观看| 亚洲乱亚洲乱妇无码| 日韩专区中文字幕| 亚洲美女性生活视频| 国产97在线|日韩| 亚洲free性xxxx护士hd| 中文字幕久精品免费视频| 亚洲片国产一区一级在线观看| 色系列之999| 久久在线精品视频| 国产精品久久久久久久久粉嫩av| 亚洲日本中文字幕| 国产精品久久久久久久app| 91沈先生在线观看| 日韩激情在线视频| 国产精品99久久久久久久久| 中文字幕日本欧美| 欧美成人免费小视频| 亚洲精品www久久久| 在线成人激情黄色| 伊人久久大香线蕉av一区二区| 欧美高清理论片| 久久久久久有精品国产| 欧美午夜视频在线观看| 欧美在线不卡区| 亚洲国产91精品在线观看| 亚洲午夜未删减在线观看| 亚洲xxxx做受欧美| 精品高清美女精品国产区| 日韩电影免费观看在线观看| 欧美色另类天堂2015| 久久久免费av| 日韩av中文字幕在线免费观看| 日韩在线中文字幕| 在线视频亚洲欧美| 精品日韩视频在线观看| 欧美在线视频观看| 欧美成人激情在线| 久久久亚洲精选| 亚洲人午夜色婷婷| 成人久久一区二区| 欧美精品在线第一页| 亚洲精品综合久久中文字幕| 国产成+人+综合+亚洲欧美丁香花| 亚洲jizzjizz日本少妇| 欧美精品18videos性欧| 欧美日韩中文字幕在线视频| 国产精品久久久久久久久久久久| 亚洲老头同性xxxxx| 国产免费成人av| 日韩三级成人av网| 欧美激情精品久久久久久大尺度| 国产成人欧美在线观看| 亚洲va电影大全| 日韩在线视频免费观看高清中文| 欧美性xxxxxxx| 欧美日韩成人免费| 欧美成人激情图片网| 欧美日韩亚洲一区二区三区| 久久免费精品日本久久中文字幕| 欧美亚洲另类视频| 日韩av中文字幕在线免费观看| 国产精品91在线| 亚洲人成77777在线观看网| 国产精品久久久久久久久借妻| 视频在线观看99| 日韩精品在线免费| 亚洲a∨日韩av高清在线观看| 国产精品视频一| 91色视频在线观看| 久久午夜a级毛片| 欧美日韩国产成人高清视频| 久久99精品久久久久久青青91| 精品亚洲一区二区三区| 成人伊人精品色xxxx视频| 国产精品久久久久久av下载红粉| 亚洲女人初尝黑人巨大| 欧美日韩加勒比精品一区| 欧美日韩不卡合集视频| 日日噜噜噜夜夜爽亚洲精品| 亚洲男人第一av网站| 97免费中文视频在线观看| 日韩av电影在线播放| 亚洲成人网在线观看| 91精品国产色综合久久不卡98口| 久久久久久伊人| 欧美中文字幕精品| 亚洲91精品在线观看| 俺去亚洲欧洲欧美日韩| 亚洲精品视频网上网址在线观看| 国产情人节一区| 日韩国产一区三区| 北条麻妃99精品青青久久| 国产亚洲精品久久久久久牛牛| 亚洲男人天堂九九视频| 亚洲**2019国产| 成人精品在线视频| 亚洲欧洲在线观看| 亚洲色图综合网| 国产精品入口福利| 日韩av免费在线看| 国产精品美女免费| www.久久草.com| 91人人爽人人爽人人精88v| 国产精品入口日韩视频大尺度| 欧美午夜精品久久久久久浪潮| 国产精品影院在线观看| 欧美体内谢she精2性欧美| 亚洲最大的网站| 欧美一区二区三区图| 欧美性猛交xxxx| 91精品国产91久久| 91在线|亚洲| 狠狠色香婷婷久久亚洲精品| 欧美福利视频网站| 欧美激情在线观看视频| 亚洲精品国产精品自产a区红杏吧| 日韩电影在线观看免费|