程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 一起talk(第八十回:C語言實例--進程互斥)

一起talk(第八十回:C語言實例--進程互斥)

編輯:關於C語言

一起talk(第八十回:C語言實例--進程互斥)



各位看官們,大家好,上一回中咱們說的是父進程與子進程的例子,這一回咱們說的例子是:進程互斥。閒話休提,言歸正轉。讓我們一起talk C栗子吧!

我們在上一回中介紹了父進程與子進程的例子,這一回,我們說的是進程之間的互斥。所謂的互斥就是指兩個進程按照一定的順序使用臨界資源。比如鍵盤就是一種臨界資源。如果父進程在使用的時候,子進程需要等待,直到父進程使用完後,它才能使用。接下來,我們通過一個實際的例子進行說明:

int main()
{
    pid_t pid;
    pid_t pid_res;
    int count = 0;
    int stat_value;

    pid = fork();

    if(pid > 0)
    {
        printf("PID: %d -> Father Process is running \n",getpid());
        count++;
        printf("count is %d in Father Process \n",count);
    }
    else if(pid == 0)
    {
        printf("PID: %d -> Son Process is running \n",getpid());
        count++;
        printf("count is %d in Son Process \n",count);
    }
    else
    {
        printf("Create process failed \n");
        return 1;
    }

    return 0;
}

我們把編譯上面的代碼並且運行,可以得到以下結果:

 ./s                                   //運行編譯後的程序
PID: 3030 -> Father Process is running 
count is 1 in Father Process           //父進程在使用count這種臨界資源
PID: 3031 -> Son Process is running 
count is 1 in Son Process              //子進程在使用count這種臨界資源

在上面的代碼中,我們使用count模仿臨界資源,從程序的運行結果可以看到,父進程和子進程,對count的使用沒有任何聯系,它們幾乎是同時使用該臨界資源,沒有一定的順序。(當然,count在程序中不是真正的臨界資源,我們只是在模仿)。

如果想讓進程之間按照一定的順序使用臨界資源,那麼可以使用wait函數。它通常在父進程中使用,在父進程中使用wait函數後,它會一直等待子進程運行,直到子進程運行結束了,它才開始運行父進程中的內容。下面是我們使用wait後的代碼:

int main()
{
    pid_t pid;
    pid_t pid_res;
    int count = 0;
    int stat_value;

    pid = fork();

    if(pid > 0)
    {
        printf("PID: %d -> Father Process is running \n",getpid());
        pid_res = wait(&stat_value);         //使用wait函數實現進程互斥

        if(pid_res > 0)                      //等待子進程結束後,再使用臨界資源
        {
            printf("Son process finished: PID = %d \n",pid_res);
            count++;
            printf("count is %d in Father Process \n",count);
        }
    }
    else if(pid == 0)
    {
        printf("PID: %d -> Son Process is running \n",getpid());
        count++;
        printf("count is %d in Son Process \n",count);
    }
    else
    {
        printf("Create process failed \n");
        return 1;
    }

    return 0;
}

下面是程序的運行結果,請大家和沒有使用wait函數的運行結果進程對比。

 ./s                                     //運行編譯後的程序
PID: 3073 -> Father Process is running   //父進程沒有使用count這種臨界資源
PID: 3074 -> Son Process is running      
count is 1 in Son Process                //子進程在使用count這種臨界資源
Son process finished: PID = 3074         //子進程結束
count is 1 in Father Process             //父進程在使用count這種臨界資源   

看官們,正文中就不寫代碼了,詳細的代碼放到了我的資源中,大家可以點擊這裡下載使用。

各位看官,關於進程互斥的例子咱們就說到這裡。欲知後面還有什麼例子,且聽下回分解。


  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved