- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正试图解决哲学家就餐问题中的一个僵局。我已经有了我的老师提供的代码框架。
我尝试使用 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/
我有类似下面的代码: ... id: myComponent signal updateState() property variant modelList: [] Repeater { mo
我正在处理一些我无法展示的私有(private)代码,但我已经制作了一些示例代码来描述我的问题: 主.c: #include #include #include #include typede
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicate: what are the differences in die() and exit() in PHP? 我想
在编写 Perl 模块时,在模块内部使用 croak/die 是一个好习惯吗? 毕竟,如果调用者不使用 eval block ,模块可能会使调用它的程序崩溃。 在这些情况下,最佳做法是什么? 最佳答案
我有一些搜索线程正在存储结果。我知道当线程启动时,JVM native 代码会代理在操作系统上创建新 native 线程的请求。这需要 JVM 之外的一些内存。当线程终止并且我保留对它的引用并将其用作
我刚刚花了很多时间调试一个我追溯到 wantarray() 的问题。 .我已将其提炼为这个测试用例。 (忽略 $! 在这种情况下不会有任何有用信息的事实)。我想知道为什么wantarray在第二个示例
我看到一些代码是这样做的: if(something){ echo 'exit from program'; die; } ...more code 和其他只使用 die 的人: if
我正在尝试将此表格用于: 如果任何 $_POST 变量等于任何其他 $_POST 变量抛出错误。 如果只有几个,那不是问题,但我有大约 20 个左右所以如果我想这样做,我将不得不像这样 但这
每次我运行: hadoop dfsadmin -report 我得到以下输出: Configured Capacity: 0 (0 KB) Present Capacity: 0 (0 KB) DFS
我是一名优秀的程序员,十分优秀!