2012-04-10 79 views
0

我有一個多點觸摸應用程序。它有3個ccv應用程序向它發送udp數據包。創建的應用程序通過多線程的ofxTuio接收所有這些數據包。然後,這些觸及到我們在單個線程中編寫的代碼中。我們有顯示對象。它們每個都有一個包含指向它們包含的所有對象的指針的列表。例如,我們寫了onEnterFrame,addChild,removeChild;功能與您在動作中看到的顯示列表語法類似。但是,由於多線程tuio事件,我們正在迭代對象列表中的錯誤(併發)問題。我們如何防止這種情況發生。看起來好像鎖定(互斥)不會是正確的,因爲這些列表不在多線程上訪問。我爲這個列表創建了一個自定義隊列,他們從不迭代,而對象被刪除或添加到列表中,有幾個布爾值和一些額外的隊列列表。我懷疑人們遇到過這樣的事情,什麼是適當的做法?C++。多線程瓶頸縮小到列表中的單線程應用程序

回答

2

如果您有多個線程,標誌是不夠的。使用互斥鎖或其他關鍵部分來鎖定讀取和寫入訪問。如果您有任何異步或未經請求的事件,這就是他們的目標。

1

使用互斥鎖或原子compare_and_swap指令使您的數據結構是線程安全的。

0

如果您使用std :: list,但從列表中刪除不會使迭代器失效,事實上,您必須迭代正在被刪除的元素才能產生問題。如果你可以在單線程上構造你的算法來處理它,這可能就足夠了。

我很好奇你會得到什麼樣的迭代器錯誤,你會得到不兼容的錯誤?顯示對象如何獲取他們的列表?通過這個隊列?一旦對象有列表可以更改列表?