2012-04-10 47 views
0

我有一个多点触摸应用程序。它有3个ccv应用程序向它发送udp数据包。创建的应用程序通过多线程的ofxTuio接收所有这些数据包。然后,这些触及到我们在单个线程中编写的代码中。我们有显示对象。它们每个都有一个包含指向它们包含的所有对象的指针的列表。例如,我们写了onEnterFrame,addChild,removeChild;功能与您在动作中看到的显示列表语法类似。但是,由于多线程tuio事件,我们正在迭代对象列表中的错误(并发)问题。我们如何防止这种情况发生。看起来好像锁定(互斥)不会是正确的,因为这些列表不在多线程上访问。我为这个列表创建了一个自定义队列,他们从不迭代,而对象被删除或添加到列表中,有几个布尔值和一些额外的队列列表。我怀疑人们遇到过这样的事情,什么是适当的做法?C++。多线程瓶颈缩小到列表中的单线程应用程序

回答

2

如果您有多个线程,标志是不够的。使用互斥锁或其他关键部分来锁定读取和写入访问。如果您有任何异步或未经请求的事件,这就是他们的目标。

1

使用互斥锁或原子compare_and_swap指令使您的数据结构是线程安全的。

0

如果您使用std :: list,但从列表中删除不会使迭代器失效,事实上,您必须迭代正在被删除的元素才能产生问题。如果你可以在单线程上构造你的算法来处理它,这可能就足够了。

我很好奇你会得到什么样的迭代器错误,你会得到不兼容的错误?显示对象如何获取他们的列表?通过这个队列?一旦对象有列表可以更改列表?