我的應用程序中有兩個線程共享的std::list<Info> infoList
。這些2個線程如下訪問此列表:實時應用程序中多線程之間同步容器訪問的最佳方式
線程1:列表(根據情況) 線程2上使用push_back()
,pop_front()
或clear()
:使用一個iterator
穿過的項目來迭代列出並採取一些行動。
線程2是迭代的列表如下所示:
for(std::list<Info>::iterator i = infoList.begin(); i != infoList.end(); ++i)
{
DoAction(i);
}
的代碼是使用GCC 4.4.2編譯。
有時++我導致段錯誤並崩潰應用程序。該錯誤是由std_list.h行143在下面行:
_M_node = _M_node->_M_next;
我想這是一個競速條件。當線程2迭代它時,該列表可能已被線程1更改或清除。
我使用Mutex來同步對這個列表的訪問,並且在我的初始測試過程中一切正常。但系統在壓力測試下凍結,使得這個解決方案完全無法接受。這個應用程序是一個實時應用程序,我需要找到一個解決方案,這樣兩個線程可以儘可能快地運行,而不會影響總應用程序的吞吐量。
我的問題是這樣的: 線程1和線程2需要儘可能快地執行,因爲這是一個實時應用程序。我能做些什麼來防止這個問題,並仍然保持應用程序的性能?有沒有可用於這種問題的無鎖算法?
它確定如果我錯過了線程2迭代中新增的Info
對象,但是我能做些什麼來防止迭代器成爲懸掛指針?
感謝
Sutters關於編寫無鎖隊列的文章可能有所幫助:http://www.ddj.com/cpp/210604448 –
http://stackoverflow.com/questions/1724630/how-do-i-build- a-lockless-queue –
爲什麼你不能使用隊列而不是列表?您的消費者線程如何通知新的Info對象? –