我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);
}
Run Code Online (Sandbox Code Playgroud)
代码使用GCC 4.4.2编译.
有时++ i会导致段错误并导致应用程序崩溃.该错误是在以下行的std_list.h第143行引起的:
_M_node = _M_node->_M_next;
Run Code Online (Sandbox Code Playgroud)
我想这是一个赛车条件.当线程2迭代它时,列表可能已被线程1更改或甚至清除.
我使用Mutex来同步对此列表的访问,并且在我的初始测试期间一切正常.但是系统只是在压力测试下冻结,使得这个解决方案完全不可接受.此应用程序是一个实时应用程序,我需要找到一个解决方案,以便两个线程可以尽可能快地运行,而不会损害总的应用程序吞吐量.
我的问题是:线程1和线程2需要尽可能快地执行,因为这是一个实时应用程序.我该怎么做才能防止这个问题并仍然保持应用程序性能?是否有任何无锁算法可用于此类问题?
如果我Info在线程2的迭代中错过了一些新添加的对象,但是我可以做些什么来防止迭代器成为悬空指针?
谢谢
我在一个具有并发访问列表的站点上遇到了一些问题.此列表保留一个项目的购物车,并且多个删除正在使网站崩溃. 哪个是同步它们的最佳方法? 锁够了吗?锁定选项似乎很难看,因为代码遍布整个地方并且非常混乱.
更新:这是一个如下实现的列表:public class MyList:List <SomeCustomType> {}
这是一个遗留站点,因此不允许进行太多修改.我应该如何重构这个以便在迭代时安全锁定?
任何的想法!