【问题标题】:C++. multi-threaded bottle necking into a single threaded applicatin with listsC++。多线程瓶颈到带有列表的单线程应用程序
【发布时间】:2012-04-10 20:19:12
【问题描述】:

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

【问题讨论】:

    标签: c++ multithreading list concurrency locking


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        如果您使用 std::list 任何内容,但从列表中删除不会使迭代器无效,实际上您必须迭代要删除的元素才能造成问题。如果您可以构建您的算法以在单线程上以这种方式处理它,这可能就足够了。

        我很好奇您遇到了什么样的迭代器错误,您是否遇到了不兼容的错误?显示对象如何获取它们的列表?通过这个队列?一旦对象有了列表,列表可以改变吗?

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-05-12
          • 2014-05-02
          • 2023-04-04
          • 1970-01-01
          • 2010-11-01
          相关资源
          最近更新 更多