gpt4 book ai didi

c++ - 如何防止用餐哲学家c++中的死锁

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:13 26 4
gpt4 key购买 nike

我正试图解决哲学家就餐问题中的一个僵局。我已经有了我的老师提供的代码框架。

我尝试使用 try_lock() 解决问题

chopstick[(i+1)%5].try_lock(); 

但这并没有解决我的问题,当我运行它时确实收到了以下错误消息:错误“解锁无主互斥量”。

我还尝试通过在 youtube 视频中看到的以下更改来解决问题

chopstick[i].lock();

chopstick[min(i,(i+1)%5)].lock();

还有

chopstick[(i+1)%5].lock();

chopstick[max(i,(i+1)%5)].lock();

这是我得到的骨架。

#include <windows.h>
#include <stdio.h>
#include <iostream>
#include <vector>
#include <algorithm>
#include <thread>
#include <mutex>
#include <time.h>

using namespace std;

thread task[5];
mutex chopstick[5];
int stop = false;

void go(int i) {
while (!stop) {

chopstick[i].lock();

cout << i << ": takes: " << i << endl;
chrono::milliseconds dur(20);
this_thread::sleep_for(dur); //Leads to deadlock immediately
chopstick[(i + 1) % 5].lock();

cout << i << ": eating" << endl;

chrono::milliseconds dur2(rand() % 200 + 100);
this_thread::sleep_for(dur2);

chopstick[(i + 1) % 5].unlock();
chopstick[i].unlock();
}
}
int main() {
srand(time(NULL));

for (int i = 0; i < 5; ++i) {
task[i] = (thread(go, i));
}
for (int i = 0; i < 5; i++) {
task[i].join();
}

}

我在理论上了解餐饮哲学家,但我无法解决这个问题。我真的不明白我做错了什么。有人可以解释我做错了什么并帮助我解决问题吗?

最佳答案

并行编程(使用锁)的核心规则之一是,您应该始终以相同的顺序获取锁。

在您的代码中,每个任务首先获取其锁,然后获取下一个锁。一种解决方案是始终从偶数索引获取锁,然后才从奇数索引获取锁。这样,您获取锁的顺序将保持一致。

另一个众所周知的策略是“回退”,您使用 lock() 获取第一个锁,然后使用 try_lock() 获取后续锁,如果一个无法获得,你释放所有获得的锁并重新开始序列。这种策略在性能方面并不好,但它保证最终会起作用。

关于c++ - 如何防止用餐哲学家c++中的死锁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55653850/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com