gpt4 book ai didi

c++ - 多CPU多线程中的多线程

转载 作者:太空狗 更新时间:2023-10-29 23:03:40 24 4
gpt4 key购买 nike

假设我有一个无向图。

图表的一小部分:

A -----\
C
B -----/

现在节点 A 和 B 继续并行修改节点 C。//节点 A 和节点 B 在并行线程中处理节点 C。

我希望节点 B 的线程将等待节点 A 的线程完成处理。它必须是这样的。没有其他办法。

我也不希望正在处理其他节点的其他线程等待上述条件,即我不想使用互斥量。

我已经创建了一个类成员 bool 标志,并想将其用作条件。//让那个标记为 d_flag

此处的 MT 使用多个 CPU。

我认为行不通的解决方案:

CPU1 : 线程 1

while (d_flag) {
// busy waiting
}
d_flag = true;

// Critical Section

d_flag = false;

CPU2:线程 1

while (d_flag) {
// busy waiting
}

d_flag = true;

// Critical Section

d_flag = false;

我的理解是,如果在多 CPU 中,节点 A 线程在 CPU1 上运行,节点 B 线程在 CPU 2 上运行,则自旋锁失效。

由于 while 循环中的测试不再是原子的,因此可能存在 while 循环评估为 false 的情况。

我的理解对吗?????如果是,是否有不使用整体互斥锁的解决方案。

最佳答案

我建议创建一个条件分支,仅当正在处理的节点是 C 时才执行。在该分支中,您可以为节点 B 线程设置一个条件变量,以等待节点 A 线程完成对节点 C 的处理。假设您知道与节点关联的线程 ID,我认为这很容易实现(至少是天真地)。如果您不确定节点 A 的线程是否会完成处理,您可能希望实现一个带有超时的条件变量节点C。

如果我可以提出建议,您的用例对特定线程的节点上的操作顺序有限制,这表明您可能需要考虑并行编程范例,它允许您在更高的抽象级别上表达这些想法。也许使用 Actor 模式会有帮助?

这是一个我认为非常适合 C++ 的实现:

https://github.com/Neverlord/libcppa

http://libcppa.blogspot.com/

使用这样的模式,您可以让您的参与者(线程)就它们已处理的节点进行通信,并根据这些通信控制它们的流程。因此,例如,您可以让节点 A actor 在完成处理节点 C 时通知节点 B actor。这允许节点 B actor 在等待来自 A 的消息时做其他事情。

关于c++ - 多CPU多线程中的多线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24865416/

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