0

我有一个多点触控应用程序。它有 3 个 ccv 应用程序向它发送 udp 数据包。创建的应用程序通过多线程的 ofxTuio 接收所有这些数据包。然后这些接触将进入我们在单个线程上编写的代码中。我们有显示对象。它们每个都有一个列表,其中包含指向它们包含的所有对象的指针。比如我们写过,onEnterFrame、addChild、removeChild;功能类似于您在 actionscript 中看到的显示列表语法。但是,由于多线程 tuio 事件,我们在对象列表上遇到了迭代错误(并发)问题。我们如何防止这种情况发生。似乎锁定(互斥锁)是不正确的,因为这些列表没有在多个线程上被访问。我为这个列表创建了一个自定义队列,当对象被删除或添加到列表中时,它们从不迭代,带有几个布尔值和一些额外的排队列表。我怀疑人们遇到过这样的事情,什么是正确的做法?

4

3 回答 3

2

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

于 2012-04-10T20:31:19.920 回答
1

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

于 2012-04-10T20:41:15.987 回答
0

If you are using the std::list anything but removing from the list will not invalidate iterators, in fact you have to be iterating the element being removed for this to pose a problem. If you can structure your algorithm to handle it this way on the single thread this may be enough.

I'm curious as to what kind of iterator errors you are getting, are you getting incompatible errors? How do the display object's get their lists? Via this Queue? Once the object has the list can the list be changed?

于 2012-04-10T22:13:56.823 回答