使用信号量 (BACI) 就餐哲学家

Posted

技术标签:

【中文标题】使用信号量 (BACI) 就餐哲学家【英文标题】:Dining philosophers using semaphores (BACI) 【发布时间】:2018-06-02 08:33:03 【问题描述】:

我必须通过使用信号量来解决哲学家就餐问题。在我的代码中,每一位哲学家都在拿一根筷子,其余的都在等待。

我在主函数中仍然有一些错误。你能告诉我如何启动筷子[k]吗?我是BACI的初学者。

binarysem ChopStick[5];
binarysem speak;

void philosopher(int index)
int i,k;
int x;
x=0;
for(i=0;i<k;i++)
    cout << "I am philosopher: " << index << " and i am thinking "<< endl;
    signal(speak);
    if(index % 2 == 0)
        wait(ChopStick[index]);
        wait(ChopStick[(index+1) % 5]);
        
        else
        wait(ChopStick[index]);
        wait(ChopStick[(index+1) % 5]);
        
    x++;
    wait(speak);
    cout <<"I am philosopher: "<< index <<" and i eat: "<< x << "times" << endl;
    signal(speak);
    signal(ChopStick[index]);
    signal(ChopStick[(index+1) % 5]);

main()
int k;
for(k=0;k<5;k++)
    initialsem(ChopStick[k],1);
    initialsem(speak,1);
    
cobegin
    
        philosopher(1); philosopher(2); philosopher(3); philosopher(4); philosopher(5);
    

【问题讨论】:

请分享您遇到的具体错误 我遇到了数组“initialsem 不是‘数组’类型的问题。我不知道如何启动它。 【参考方案1】:

根据this BACI summary,听起来数组应该像在 C 中一样初始化。所以你会想要这样的东西:

binarysem initialsem[5];

(其中5是数组的长度,binarysem是数组元素的数据类型)

【讨论】:

以上是关于使用信号量 (BACI) 就餐哲学家的主要内容,如果未能解决你的问题,请参考以下文章

哲学家就餐问题与死锁总结

哲学家就餐问题

这个解决哲学家就餐问题 (dpp) 的解决方案是如何工作的?互斥量和信号量

信号量解决哲学家就餐问题(GUI动态演示)

操作系统实验2:进程管理

使用信号量在 Java 中用餐哲学家