对派生类隐藏 mutex 的锁

头文件:

class MyLockTest
{
public:
    MyLockTest();
    ~MyLockTest();
public:
    void DoSomething();
protected:
    struct lock_guard;
private:
    struct Impl;
    Impl *m_impl;
};


class ExMyLockTest :public MyLockTest
{
public:
    void DoSomething2();
};

cpp 文件:


struct MyLockTest::Impl
{
    std::mutex mtxObj;
};


struct MyLockTest::lock_guard
{
    explicit lock_guard(MyLockTest *host);
    ~lock_guard();
    lock_guard(const lock_guard &lock) = delete;
    lock_guard &operator=(const lock_guard &lock) = delete;
    MyLockTest *m_host{ nullptr };
};


MyLockTest::lock_guard::lock_guard(MyLockTest *host)
    :m_host(host)
{
    m_host->m_impl->mtxObj.lock();
}

MyLockTest::lock_guard::~lock_guard()
{
    m_host->m_impl->mtxObj.unlock();
}


MyLockTest::MyLockTest()
    :m_impl(new Impl)
{
}


MyLockTest::~MyLockTest()
{
    delete m_impl;
}


void MyLockTest::DoSomething()
{
    lock_guard lock(this);
    std::cout << "Do some Thing 1 ..." << "\n";
    std::this_thread::sleep_for(std::chrono::milliseconds(5000));
    std::cout << "finished thing 1 ..." << '\n';
}


void ExMyLockTest::DoSomething2()
{
    lock_guard lock(this);
    std::cout << "Do some Thing 2 ..." << "\n";
    std::this_thread::sleep_for(std::chrono::milliseconds(2500));
    std::cout << "finished thing 2 ..." << '\n';
}

测试输出:

Do some Thing 1 ...
btn click, start thing 2...
finished thing 1 ...
Do some Thing 2 ...
finished thing 2 ...
posted @ 2026-10-22 16:41  double64  阅读(2)  评论(0)    收藏  举报