對不起,我正在重複一個問題https://stackoverflow.com/questions/5687837/monitor-implementation-in-c,但尚未得到解決方案。我可能錯誤地問了這個問題。只有一個進程必須一次執行代碼部分
假設我有一個代碼部分B.一個父進程產生了許多子進程來執行代碼B,但我希望一次只有一個進程在代碼部分B內部。我如何在Linux平臺上的C上做到這一點?
感謝您的幫助
編輯。不是線程而是進程。
對不起,我正在重複一個問題https://stackoverflow.com/questions/5687837/monitor-implementation-in-c,但尚未得到解決方案。我可能錯誤地問了這個問題。只有一個進程必須一次執行代碼部分
假設我有一個代碼部分B.一個父進程產生了許多子進程來執行代碼B,但我希望一次只有一個進程在代碼部分B內部。我如何在Linux平臺上的C上做到這一點?
感謝您的幫助
編輯。不是線程而是進程。
你想要一個互斥鎖。
pthread_mutex_t mutexsum;
pthread_mutex_init(&mutexsum, NULL);
pthread_mutex_lock (&mutexsum);
// Critical code
pthread_mutex_unlock (&mutexsum);
如果您認真對待多進程而不是多線程,互斥量需要存儲在共享內存段中。
並且爲了將互斥鎖放入共享內存中,請看['shmget 2)'](http://linux.die.net/man/2/shmget)和朋友。 – 2011-05-25 05:15:11
對於共享段,我認爲'shm_open'接口和'mmap'一起更容易處理。 – 2011-05-25 05:33:23
所以你想要的是在任何時間點都有一個孩子正在運行,那麼爲什麼一次產生所有的孩子?
當一個子進程結束時,發出一個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;
}
線程=進程 – 2011-05-25 04:19:47
我想建議你應該鎖定你的_data_,不是你的_code_。識別共享數據並確保鎖定在適當的位置以保護共享數據。嘗試鎖定您的_code_是寫意大利麪的快捷方式。 :) – sarnold 2011-05-25 04:20:01
你的其他問題有相當數量的刪除答案,包括['pthread_cond_wait'](http://pubs.opengroup.org/onlinepubs/009695399/functions/pthread_cond_wait.html) - 但遺憾的是, t留下評論關於_why_他刪除了它。這似乎是對我有用的起點.. – sarnold 2011-05-25 04:22:34