对不起,我正在重复一个问题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