2011-05-25 118 views
1

對不起,我正在重複一個問題https://stackoverflow.com/questions/5687837/monitor-implementation-in-c,但尚未得到解決方案。我可能錯誤地問了這個問題。只有一個進程必須一次執行代碼部分

假設我有一個代碼部分B.一個父進程產生了許多子進程來執行代碼B,但我希望一次只有一個進程在代碼部分B內部。我如何在Linux平臺上的C上做到這一點?

感謝您的幫助

編輯。不是線程而是進程。

+3

線程=進程 – 2011-05-25 04:19:47

+2

我想建議你應該鎖定你的_data_,不是你的_code_。識別共享數據並確保鎖定在適當的位置以保護共享數據。嘗試鎖定您的_code_是寫意大利麪的快捷方式。 :) – sarnold 2011-05-25 04:20:01

+0

你的其他問題有相當數量的刪除答案,包括['pthread_cond_wait'](http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_cond_wait.html) - 但遺憾的是, t留下評論關於_why_他刪除了它。這似乎是對我有用的起點.. – sarnold 2011-05-25 04:22:34

回答

4

你想要一個互斥鎖。

pthread_mutex_t mutexsum; 
pthread_mutex_init(&mutexsum, NULL); 
pthread_mutex_lock (&mutexsum); 
// Critical code 
pthread_mutex_unlock (&mutexsum); 

如果您認真對待多進程而不是多線程,互斥量需要存儲在共享內存段中。

+0

並且爲了將互斥鎖放入共享內存中,請看['shmget 2)'](http://linux.die.net/man/2/shmget)和朋友。 – 2011-05-25 05:15:11

+0

對於共享段,我認爲'shm_open'接口和'mmap'一起更容易處理。 – 2011-05-25 05:33:23

0

所以你想要的是在任何時間點都有一個孩子正在運行,那麼爲什麼一次產生所有的孩子?

當一個子進程結束時,發出一個SIGCHLD,你可以爲這個信號編寫你自己的處理程序,並從處理程序中產生調用。然後當有一個新的子進程消亡時創建一個新的子進程 - 只有一個子進程正在運行。下面是一個黑客(無用,只是爲了演示)來實現這一目標:

#include <stdio.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <signal.h> 
#include <stdlib.h>  

void spawn(void){ 

    pid_t child_pid=fork(); 

    if(child_pid > 0){ 
     printf("new child created by %d !\n",getpid()); 
     sleep(1); 
    }else if(child_pid == 0){ 
     printf("child %d created !\n",getpid()); 

    }else{ 
     exit(EXIT_FAILURE); 
    } 
} 


void handler(int sigval){ 
    spawn();  
} 

int main(void){ 
    signal(SIGCHLD,handler); 
    spawn(); 
    return 0; 
}