通过继承而不是组合来锁定

Leo*_*Hat 3 c++ inheritance mutex locking critical-section

在我编写或评论的大多数代码中,锁定是通过组合实现的,其中一个类拥有一个关键部分或互斥锁:

class MyClass
{
    Mutex mMutex;
};
Run Code Online (Sandbox Code Playgroud)

当可以通过多个线程访问可变成员时,我们通过RAII获取并释放锁,如下所示:

void MyClass::Method()
{
    Lock lock(mMutex);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

今天我回顾了一些代码通过继承实现锁定的代码,如下所示:

class MyClass : public Mutex
{
    // ...
};
Run Code Online (Sandbox Code Playgroud)

锁定由类锁定"本身"执行:

void MyClass::Method()
{
    Lock lock(this);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

这种方法有什么优点或缺点吗?或者这只是一个风格问题?

Jam*_*lis 6

这几乎没有意义.是MyClass某种扩展同步对象的Mutex?如果没有,那么继承几乎可以肯定是错误的选择,因为它没有任何意义使用MyClassMutex(关系MyClassMutex是不是"是"的关系).

这也很危险:

MyClass x;
Lock lock(x);
x.Method();   // uh oh.
Run Code Online (Sandbox Code Playgroud)

  • @Michael:有些平台/线程库有"Mutex"和"RecursiveMutex",如果一个线程第二次锁定Mutex,它就会自动死锁.我不知道这是否是一种常见的方法. (2认同)