如何使用一个信号灯同步 3 个进程?
How to synchronise 3 processes with one semaphore?
我收到了一项任务,将 3 个任务与一个信号灯同步。
前两个任务生成随机数,第三个任务打印其总和。
因此,前两个任务应在开始时执行,第三个任务应在结束时执行。到目前为止,下面的代码为我提供了最接近我想要实现的结果,但是它显然不时陷入僵局,我无法找到仅用一个信号量解决此问题的方法:(
semaphore sem;
int var1;
int var2;
void rndo(int& var) {
int i;
wait(sem);
var = random(10);
cout << var << "n" << endl;
signal(sem);
}
void rndt(int& var) {
int i;
wait(sem);
var = random(10);
cout << var << "n" << endl;
signal(sem);
signal(sem);
}
void prt(){
int sum;
wait(sem);
wait(sem);
wait(sem);
cout << var1 << "- 1 2 - " << var2 << "n" << endl;
sum = var1 + var2;
cout << sum << " - full sum" << endl;
}
main(){
initialsem(sem, 2);
cobegin {
rndt(var1); rndo(var2); prt();
}
cout << "All processes finished" << endl;
}
如果打印机设法等待两次,然后工人才能等待,则会出现死锁: 打印机卡在第三个等待中,而工作人员在第一个(唯一(等待中卡住。
一个明显的解决方案是从值 0 开始信号量,让打印机等待两次,然后让每个工作人员只做一次发布 - 每次一次。
伪代码:
main:
initialsem(sem,0);
/*...*/
worker{1,2}:
do_work();
post();
printer:
wait(); wait();
do_print();
相关文章:
- Windows 进程间同步类似事件?
- 如何使用一个信号灯同步 3 个进程?
- 使计时器在C++进程中的特定时间关闭,以便同步两个进程
- 多个线程/进程是否可以在不同步的情况下同时从/写入文件的非重叠区域?
- 如何为以下代码进行进程同步
- 互斥和进程同步;C++
- boost::OSX 上 32 位和 64 位程序之间共享内存中的进程间同步机制(互斥体、条件)
- 进程重定向可以在bash中同步吗
- 如何将记忆映射的文件与另一个进程写入文件同步
- 在Windows(win32或C++)中使用互斥锁的进程间同步
- std::launch::async就像同步进程一样阻塞
- 如何在Boost.process 0.5中与进程同步交互
- 执行这些 Boost::进程间组件需要同步
- MailSlot的进程同步
- 如何使用管道同步父进程和子进程
- Win32 将同步事件发送到其他进程
- 使用 WinAPI/C++ 在 Windows 上的进程之间进行多读取器、单写入器同步锁定
- 有没有办法在考虑到崩溃的情况下同步进程
- c++ 11的condition_variables可以用来同步进程吗?
- Winapi同步进程