如何在多线程程序中使用非线程安全库

时间:2014-07-11 02:00:13

标签: c++ multithreading thread-safety

我正在阅读一篇关于线程安全性的文章。我得到了这句话。

“如果您的应用程序使用未明确保证线程安全的库或其他对象,请务必小心。如有疑问,请假设它们不是线程安全的,除非另有证明。这可以通过”序列化来完成“对不确定程序的调用,等等。

所以我的问题是serializing这里是什么。作为示例如果我有非线程安全库需要在多线程应用程序中使用。怎么做?

2 个答案:

答案 0 :(得分:3)

序列化意味着使它在任何给定时间只有一个线程可以执行对库的调用。例如,如果您使用的是pthreads互斥锁,而不是仅调用:

SomePotentiallyNonThreadSafeLibraryFunction();
你会打电话给:

pthread_mutex_lock(&_myMutex);
SomePotentiallyNonThreadSafeLibraryFunction();
pthread_mutex_unlock(&_myMutex);

这样,如果第二个线程试图执行上面的代码,而第一个线程正在调用SomePotentiallyNonThreadSafeLibraryFunction(),第二个线程将等待(在pthread_mutex_lock()调用内)直到第一个线程&#39 ;呼叫已经返回并解锁了互斥锁。

答案 1 :(得分:1)

在此上下文中,serializing表示您使用某种锁定行为来避免允许对同一个非线程安全的代码进行并发调用。

例如,您可以定义一个"关键部分"围绕您的非线程安全代码。只能使用某种锁定机制,允许访问该关键部分同时使用1个线程。

例如,您可以使用mutex来避免并发访问。还有其他原语也可以帮助您控制对commong资源的共享访问。