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