The*_*ger 1 c c++ concurrency multithreading
我正在为单线程应用程序(具有非线程安全的API)开发一个多线程插件.
我当前的插件有两个线程:主线程是应用程序的线程,另一个是用于处理主线程数据的线程.简而言之,第一个创建对象,为它们提供ID,将它们插入到地图中,有时甚至可以访问和删除它们(如果应用程序这样说); 第二个是从该地图读取数据并正在改变对象.
我的问题是:为了使我的插件线程安全,我可以使用哪些技术?
首先,您必须确定可能存在竞争条件的位置.然后,您将不得不使用某种机制来确保以安全的方式访问共享数据,从而实现线程安全.
对于您的特定情况,似乎竞争条件将在共享映射上,并且可能还包含它包含的对象(映射的值)(如果两个线程可能同时尝试更改同一对象).
我的建议是你使用经过良好测试的线程安全地图实现,然后在需要时为地图的值本身添加额外的"保护".这样,您可以确保两个线程的映射始终处于一致状态,并且如果两个线程都尝试修改相同的对象数据(映射的值),则数据不会被破坏或保持不一致.
对于地图本身,您可以搜索C++的"Concurrent Hash Map"或"Atomic Hash Map"数据结构,看看它们是否质量好,可用于您的编译器/平台.很好的例子是英特尔的TBB concurrent_hash_map或Facebook 愚蠢的 AtomicHashMap.它们都有优点和缺点,你必须分析什么是最适合你的情况.
至于地图包含的对象,您可以使用普通互斥(简单,锁定,修改数据,解锁),原子操作(更棘手,仅适用于简单数据类型)或其他方法,这取决于您的编译器/平台和速度要求.
希望这可以帮助!