gpt4 book ai didi

c++ - std::unique_lock 移动语义

转载 作者:行者123 更新时间:2023-12-02 10:07:02 26 4
gpt4 key购买 nike

请帮我看看我对 std::unique_lock 的理解移动语义是正确的。
假设我有一个函数 myFunc它需要在执行开始时获取互斥锁。
这个函数是从不同的函数调用的,其中一些函数例如myWrapper1myFunc 之前持有相同的互斥锁称呼。
有时我需要在 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;
}
};

所以问题是:
  • myWrapper1有保证MyLock仅在 myWrapper1 年底发布范围,不是吗?
  • 我对这个问题使用了正确的习语吗?
  • 最佳答案

    有什么理由为什么你不能做这样的事情吗? 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();
    }

    关于c++ - std::unique_lock 移动语义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59758142/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com