我有一个应用程序,它对外部库进行了多次调用。其中一个调用不是线程安全的,所以如果我不以某种方式保护它,一切都会崩溃。
我尝试使用以下模式,即在mutex
内包裹shared_ptr
。请注意,可以在不同线程的应用程序中的许多不同位置实例化此类。
class MyClass
{
public:
MyClass(const std::shared_ptr<std::mutex>& mutex) :
_mutex(mutex)
{
}
MyClass(MyClass&& other) :
_mutex(other._mutex)
{
}
void run()
{
std::lock_guard<std::mutex> lock(*_mutex);
ExtLib::runNonThreadSafeFunction();
}
private:
std::shared_ptr<std::mutex> _mutex;
};
使用这种方法有任何风险吗?我怀疑它会导致dead-locks
,但我不确定。
如果这不是一个好方法,你会如何实现它?
注意:我也在考虑在static mutex
内使用run-function
,但我相信Visual Studio 2013
不支持它:https://connect.microsoft.com/VisualStudio/feedback/details/808030/runtime-crash-with-static-std-mutex )。