gpt4 book ai didi

c++ - 在实时应用程序中同步多个线程之间的容器访问的最佳方法是什么

转载 作者:可可西里 更新时间:2023-11-01 15:48:08 25 4
gpt4 key购买 nike

我有 std::list<Info> infoList在我的两个线程之间共享的应用程序中。这 2 个线程正在访问此列表,如下所示:

线程 1:使用 push_back() , pop_front()clear()在名单上(视情况而定)线程 2:使用 iterator遍历列表中的项目并执行一些操作。

线程 2 正在迭代列表,如下所示:

for(std::list<Info>::iterator i = infoList.begin(); i != infoList.end(); ++i)
{
DoAction(i);
}

代码使用 GCC 4.4.2 编译。

有时++i 会导致段错误并使应用程序崩溃。该错误是在 std_list.h 第 143 行中的以下行引起的:

_M_node = _M_node->_M_next;

我想这是一个赛车条件。当线程 2 迭代它时,该列表可能已被线程 1 更改甚至清除。

我使用 Mutex 来同步对此列表的访问,并且在我的初始测试期间一切正常。但是系统只是在压力测试下卡住,使得这个解决方案完全不能接受。此应用程序是一个实时应用程序,我需要找到一个解决方案,以便两个线程都可以尽可能快地运行,而不会影响应用程序的总吞吐量。

我的问题是:线程 1 和线程 2 需要尽可能快地执行,因为这是一个实时应用程序。我可以做些什么来防止这个问题并仍然保持应用程序性能?有无锁算法可以解决这样的问题吗?

没关系,如果我错过了一些新添加的 Info对象在线程 2 的迭代中,但我能做些什么来防止迭代器变成悬空指针?

谢谢

最佳答案

您的 for() 循环可能会将锁保持相对较长的时间,具体取决于它迭代了多少元素。如果它“轮询”队列,不断检查是否有新元素可用,您就会遇到真正的麻烦。这使得线程拥有互斥锁的时间过长,生产者线程很少有机会闯入并添加元素。并在此过程中消耗大量不必要的 CPU 周期。

你需要一个“有界阻塞队列”。不要自己写,锁设计不是小事。很难找到好的示例,其中大部分是 .NET 代码。 This article看起来很有前途。

关于c++ - 在实时应用程序中同步多个线程之间的容器访问的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2077119/

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