std :: unique_lock移动语义

请帮助我检查我对std::unique_lock移动语义的理解是否正确。
假设我有一个函数myFunc,该函数需要在执行开始时获取互斥体。
此函数是从不同的函数调用的,其中一些函数例如myWrapper1在调用myFunc之前保持相同的互斥锁。
有时我需要在myFunc的作用域退出时不释放此锁。

typedef std::unique_lock<std::mutex> MyLock;
class Example2
{
    std::mutex m_data_mutex;

    MyLock&& myFunc(MyLock&& lk)
    {
        bool was_lock = lk.owns_lock();
        if( !was_lock ) lk.lock();

        std::cout << "myFunc" << std::endl;

        if( !was_lock ) lk.unlock();
        return std::move(lk);
    }

    void myWrapper1()
    {
        MyLock lk(m_data_mutex);
        std::cout << "1" << std::endl;
        lk = myFunc(std::move(lk));
        std::cout << "2" << std::endl;
    }

    void myWrapper2()
    {
        MyLock lk(m_data_mutex);
        std::cout << "1" << std::endl;
        lk.unlock();
        lk = myFunc(std::move(lk));
        std::cout << "2" << std::endl;
        lk.lock();
        std::cout << "3" << std::endl;
    }
};

问题是:

  1. 对于myWrapper1,可以保证MyLock仅在myWrapper1范围的末尾才发布,不是吗?
  2. 我是否为此问题使用了正确的习惯用法?
guandehuo520 回答:std :: unique_lock移动语义

是否有某些原因导致您不能执行类似的操作? IMO,这比在所有者之间移动锁要干净得多。

std::mutex my_lock;

void myFunc_locked() {
    ...do something that requires my_lock to be locked...
}

void myFunc() {
    std::lock_guard<std::mutex> guard(my_lock);
    myFunc_locked();
}

void myWrapper1() {
    std::lock_guard<std::mutex> guard(my_lock);
    ...do something else that requires my_lock to be locked...
    myFunc_locked();
}

void myWrapper2() {
    ...
    myFunc();
}

或者按照@Nevin的建议进行。也许更清洁:

std::mutex my_lock;

void myFunc(std::lock_guard<std::mutex>> const& guard) {
    ...do something that requires my_lock to be locked...
}

void myFunc() {
    std::lock_guard<std::mutex> guard(my_lock);
    myFunc(guard);
}

void myWrapper1() {
    std::lock_guard<std::mutex> guard(my_lock);
    ...do something else that requires my_lock to be locked...
    myFunc(guard);
}

void myWrapper2() {
    ...
    myFunc();
}
本文链接:https://www.f2er.com/2762853.html

大家都在问