我使用的是第三方C ++库(OpenFst),它不是专门为线程安全设计的。但它确实有一些未使用的Mutex类。
现在我想调用该库中的一些函数并在Boost线程中运行它们。我怎样才能做到这一点?我只需要编写额外的Mutex类吗?
特别是,我的一些线程将使用该库中的一些数据结构,直到发现另一个线程已生成这些结构的更新副本。我是线程的新手,并不知道从哪里开始...
答案 0 :(得分:5)
最安全的方法是确保一次只有一个线程调用第三方库 - 也就是说,每次调用库时都要使用互斥锁。但是,使多个线程可以同时使用该库将会非常复杂,并且需要很好地理解线程安全设计以及库本身的设计。
如果您对库进行审核并发现它根本没有全局状态(即,操纵一个FST永远不会永远与另一个FST操作相同的数据进行交互),那么使用互斥锁可能是安全的个人FST的水平。如果有一些方法根本不修改FST结构,那么在多个线程中运行它们是安全的,前提是没有相同FST的编写器。但是,这需要仔细审核OpenFST代码。我建议在这里与原来的OpenFST开发人员合作;他们应该能够帮助指出潜在的陷阱和线程问题。
答案 1 :(得分:0)
您不希望阻止访问整个库。
相反,只需使用你的头 - 如果你有一个可以在任何线程的生命周期内更新的数据结构,那么同步访问该数据结构。
如果它是在任何线程开始执行之前创建的并且以只读方式使用,那么就不需要进行同步。