【问题标题】:How can I make a third-party library thread-safe for use with Boost threads?如何使第三方库线程安全以与 Boost 线程一起使用?
【发布时间】:2011-03-08 16:40:08
【问题描述】:
我正在使用第三方 C++ 库 (OpenFst),它并不是专门为线程安全而设计的。不过,它确实有一些未使用的 Mutex 类。
现在我想从该库中调用一些函数并在 Boost 线程中运行它们。我怎样才能做到这一点?我只需要编写额外的 Mutex 类吗?
特别是,我的一些线程将使用该库中的一些数据结构,直到他们发现另一个线程已经生成了这些结构的更新副本。我是线程新手,真的不知道从哪里开始......
【问题讨论】:
标签:
c++
multithreading
boost
mutex
【解决方案1】:
最安全的方法是确保一次只有一个线程调用第三方库——也就是说,在每次调用库时都使用互斥锁。然而,让多个线程可以同时使用该库将非常复杂,并且需要对线程安全设计以及库本身的设计有很好的理解。
如果您审核该库并发现它根本没有全局状态(即,操作一个 FST 永远不会与另一个 FST 操作相同的数据进行交互),那么使用互斥锁可能是安全的个别 FST 的水平。如果有一些方法根本不修改 FST 结构,那么在多个线程中运行它们可能是安全的,前提是没有相同 FST 的编写者。但是,这需要仔细审核 OpenFST 代码。我建议在这里与原始 OpenFST 开发人员合作;他们应该能够帮助指出潜在的陷阱和线程问题。
【解决方案2】:
您不想阻止对整个库的访问。
相反,只需动动脑筋 - 如果您有一个可以在任何线程的生命周期内更新的数据结构,则同步对该数据结构的访问。
如果它是在任何线程开始执行之前创建的并且是只读的,则不需要进行同步。