c - 使用信号量时忽略 Sleep()
问题描述
我正在使用信号量来同步进程。我对信号量函数 (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)
)
解决方案
//create process for each visitor
for(i=0; i<visitor; i++)
{
int v_id=fork(); // AA
if(v_id==0)
{
wait(visitor_sem); // BB
visitorArrives();
sleep(2); //this sleep works fine
}
else{
wait(NULL); // CC
}
}
for(j=0; j<visitor;j++){
wait(NULL); // DD
}
目的是在AA
. 每个新创建的进程都成为BB
. 然后在我们创建所有访问者之后,我们等待他们完成DD
。这一切都说得通。
但还等什么CC
呢?!fork
此时调用的进程AA
需要继续循环以创建下一个访问者。它不能等待它刚刚创建的访问者完成CC
——这就是DD
它的目的!
立即消除else{wait..
代码,CC
以便您的访问者同时运行。
推荐阅读
- python - 在 Tkinter 中添加背景
- generics - 如何约束运算符实现的右侧参数类型?
- scala - 找不到 cat.MonadError 类型的证据参数的隐式值
- python - 您如何将每月列从一个数据框复制到另一个数据框
- excel - 下拉菜单显示在与我输入的内容不同的组合框中
- netsuite - 基于 netsuite suitetalk 令牌的身份验证 USER_ERROR 在第二次调用中登录尝试无效
- excel - 如何在每 n 个单词后将文本滑入新段落
- javascript - 无法在 JS 中将图像拖放到另一个图像上?
- pandas - 辅助 groupby 聚合函数计算不正确
- python-3.x - pathlib 方法的完整列表