C ++通过不同实例的参考传递互斥锁

时间:2016-08-20 14:48:47

标签: c++ multithreading c++11 thread-safety mutex

我想在类的不同实例之间共享一个互斥锁,它的函数作为线程运行。我写的方式好吗? (我不认为我需要使用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;

}

1 个答案:

答案 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>