2010-06-26 82 views
1

我正在使用第三方C++库(OpenFst),它不是特别设计为线程安全的。不过,它确实有一些未使用的Mutex类。如何使用Boost线程使第三方库可以线程安全使用?

现在我想从库中调用一些函数并在Boost线程中运行它们。我怎样才能做到这一点?我是否需要编写额外的Mutex类?

特别是,我的一些线程将使用该库中的一些数据结构,直到他们发现另一个线程已生成这些结构的更新副本。我是新来的线程,并不知道从哪里开始...

回答

5

最安全的方法是确保一次只有一个线程调用第三方库 - 也就是说,需要一个互斥锁每次致电图书馆。然而,让多个线程同时使用这个库会变得非常复杂,并且需要对线程安全设计以及库本身的设计有一个很好的理解。

如果您审核库并发现它根本没有全局状态(即操纵一个FST永远不会永远与另一个FST操作相同的数据交互),那么采用互斥锁可能是安全的在单个FST的水平上。如果有一些方法根本不修改FST结构,那么可以安全地在多个线程中运行它们,前提是没有写入器可用于同一FST。但是,这需要仔细审核OpenFST代码。我建议与这里的OpenFST开发者一起工作;他们应该能够帮助指出潜在的陷阱和线程问题。

0

您不想阻止访问整个库。

相反,只需使用你的头 - 如果你有一个数据结构,可以在任何线程的生命周期内更新,然后同步访问该数据结构。

如果它是在任何线程开始执行之前创建的并且是只读的,则不需要进行同步。