首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何用一个信号量同步3个进程?

如何用一个信号量同步3个进程?
EN

Stack Overflow用户
提问于 2019-11-26 05:42:08
回答 1查看 208关注 0票数 0

我收到了一个任务,要用一个信号量同步3个任务。

前两个任务生成随机数,第三个任务打印其总和。

因此,前两个任务应该在开始时执行,第三个在结束时执行。到目前为止,下面的代码给了我最接近我想要实现的结果,但是它显然会时不时地出现死锁,而且我想不出只用一个信号量就能解决这个问题的方法:(

代码语言:javascript
运行
复制
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;
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-26 05:50:09

如果打印机在工作进程开始等待之前等待了两次,那么就会死锁:打印机在第三次等待中停滞,而工作进程在第一次(仅)等待。

一种显而易见的解决方案是从值0开始信号量,让打印机等待两次,让每个工作进程除了post之外什么也不做--每个工作进程一次。

伪代码:

代码语言:javascript
运行
复制
main:
    initialsem(sem,0);
    /*...*/

worker{1,2}:
    do_work();
    post();

printer:
    wait(); wait();
    do_print();
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59040521

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档