对派生类隐藏 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 ...
浙公网安备 33010602011771号