【发布时间】:2019-03-05 10:50:35
【问题描述】:
我正在使用信号量来同步进程。我对信号量函数的行为有些困惑(wait() 和 signal())
我的场景:
我有两个循环创建这些进程
visitor和keyholder:访客和钥匙持有人可以突然到达房屋(无论是 同时有几个,而有些则延迟了几秒钟 彼此随机)
所以,这是我的实现:
id=fork();
if(id==0)
{
//create process for each visitor
for(i=0; i<visitor; i++)
{
int v_id=fork();
if(v_id==0)
{
wait(visitor_sem);//visitor_sem value starts at 10(10 visitors)
visitorArrives();
sleep(2); //this sleep works fine
}
else{
wait(NULL);
}
}
for(j=0; j<visitor;j++){
wait(NULL);
}
}
else
{
//create process for each keyholder
for(i=0; i<keyholder; i++)
{
int k_id=fork();
if(k_id==0)
{
wait(key_sem); //key_sem value starts at 3 (3 keyholders)
keyholderArrives();
sleep(5); //this sleep is ignored for some reason
}
}
for(j=0; j<keyholder;j++){
wait(NULL);
}
wait(NULL);
}
我的问题:
sleep()似乎只在我的子进程中做任何事情;而对父母没有影响。我应该什么时候
signal()?当我尝试使用signal()时,进程最终会无限循环(即我将signal(visitor_sem)放在sleep(2)之后)
【问题讨论】:
-
请尝试缩短您的文本和代码。目前它是一堵非结构化的文本和代码墙,并不清楚您想要实现什么。我们无法在此处粘贴操作系统 101。
-
好的,我缩短了,谢谢。我缩短了它并删除了很多我遇到的额外问题。希望它更清楚一点
-
关于:
wait(key_sem);函数:wait()用于等待(在父级中)子进程更改状态(通常等待子进程退出。也许您的意思是:@987654333 @ -
函数:
fork()尝试启动子进程。但是,有 3 种返回值: 1) 0 表示父进程正在运行。代码应该检查所有三个条件并适当处理每个条件 -
关于:
*currVisitor = *currVisitor++;这没有考虑 C 语言的优先级,似乎对++运算符有误解。建议:(*currVisitor)++;
标签: c synchronization fork semaphore