gpt4 book ai didi

c++ - 架构问题 : access-queue block

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:00:17 29 4
gpt4 key购买 nike

有一个资源管理器类。它帮助我们访问设备。但是,当然,它应该注意不要让 2 个进程同时访问一个设备。

起初我以为我不会有任何访问队列。我认为会有像 anyFree_devicename() 这样的方法,如果有空闲则返回访问句柄,如果没有空闲则返回 NULL。但是,由于某些设备的高并发性,我在每个设备中都编写了 accessQueue。

现在,当您尝试访问设备时,您的 pid(进程 ID)被插入到这样的 accessQueue 中,您可以使用特殊方法请求轮到您了。

但是,我发现了一个问题:当你在一个命令中需要很少的 devicec 时,访问队列会互相阻塞:

Device1 Device2
1 2
2 1

而且他们两个都会被屏蔽。

inline bool API::Device::Device::ShallIUse(int pid)
{
if (amIFirst(pid)) return 1; // if I'm first I can use it anyway
std::stack<int> tempStorage; // we pass every element acessQ -> Temp

while (acessQueue.front() != pid) // every process
{
//we take process pointer to look into it's queue
API::ProcessManager::Process* proc = API::ProcessManager::TaskManager::me->giveProcess(acessQueue.front());
// list of devices this prosess needs now
std::vector<API::Device::Device*>* dINeed = proc->topCommand()->devINeedPtr();
// an dsee if there any process
for (int i = 0; i < (dINeed->size() - 1); i++)
{
if (!dINeed[i]->mIFirst())
{
while ( ! tempStorage.empty())
{
acessQueue.push(tempStorage.top());
tempStorage.pop();
}
return 0;
}
}
tempStorage.push(acessQueue.front());
acessQueue.pop();
}
return 1;

我后来写了这样的算法但是:

  1. 它破坏了所有基于层的架构

  2. 现在好像出错了。

  3. 太疯狂了!我们简单地查看几乎所有进程中的所有命令,并尝试将一些命令推送到访问队列中。它运行起来真的很慢。

最佳答案

您的访问队列正在创建所谓的死锁。多个客户端被永久阻止,因为它们试图以不同的顺序获取同一组资源的所有权。

您可以通过为所有资源分配唯一值来避免这种情况。让客户向资源管理器提交所需资源的列表。资源管理器的获取方法将按资源编号对列表进行排序,然后尝试按顺序分配该组资源。

这将为所有收购强制执行特定顺序,您将永远无法陷入僵局。

当然,任何给定的客户端都会阻塞,直到它需要的所有资源集都可用为止。

关于c++ - 架构问题 : access-queue block,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3340002/

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