我std::list<Info> infoList
的应用程序中有两个线程之间共享。这 2 个线程正在访问此列表,如下所示:
线程 1:使用push_back()
,pop_front()
或clear()
在列表中(视情况而定)
线程 2:使用 aniterator
遍历列表中的项目并执行一些操作。
线程 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 需要尽快执行,因为这是一个实时应用程序。我可以做些什么来防止这个问题并仍然保持应用程序性能?是否有任何无锁算法可用于此类问题?
如果我在线程 2 的迭代中错过了一些新添加Info
的对象,那没关系,但我能做些什么来防止迭代器成为悬空指针?
谢谢