我想在类的不同实例之间共享一个互斥锁,它的函数作为线程运行。我写的方式好吗? (我不认为我需要使用shared_mutex,虽然这可能是更好的练习。我会以同样的方式传递它吗?)
class A
{
public:
// Execute some work that locks some piece of data by acquiring the mutex.
void execute(std::mutex & myMutex);
}
class B
{
public:
void execute(std::shared_ptr<A> a)
{
// Create the Threads for execution.
// Changed to correct syntax.
std::thread t1(&B::runThread, this, a);
std::thread t2(&B::runThread, this, a);
t1.join();
t2.join();
};
void runThread(std::shared_ptr<A> a)
{
a->execute(std::ref(theMutex));
}
private:
// The Mutex to share with the threads.
std::mutex theMutex;
}
答案 0 :(得分:0)
首先,发布的代码将无法编译:{{1}}是非B::runThread()
成员,因此将隐式对象作为参数。您需要使用以下内容创建线程:
static
假设std::thread t(&B::runThread, this, a);
在使用B::theMutex
时适当地保护多个线程之间共享的资源,那么在不同线程之间共享互斥锁的方法就是互斥体的用途。由于问题没有任何细节,因此无法回答互斥是否是适当的同步原语:取决于A::execute()
中的实际使用,其他方法可能更适合避免序列化,死锁等。
使用A::execute()
基本上都是错误的做法,当然不“更好的做法”。 std::shared_mutex
实际上确实导致更好的方法的情况非常罕见。在实践中,我从未见过使用类似std::shared_mutex
之类的东西导致性能提升的情况(我没有看到std::shared_mutex
在野外但我经常遇到的POSIX计数器部件或包装器经常出现) 。相反,它总是导致比使用普通std::shared_mutex
es更糟糕的性能,并且它具有极其糟糕的最坏情况行为:当存在大量更改(即排他锁)时,它经常导致整个系统的戏剧性停顿。 / p>