微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

返回包装私有互斥锁的锁卫的函数

如何解决返回包装私有互斥锁的锁卫的函数

我有一个简单的类,其中私下声明了以下内容

std::mutex headMutex;  
std::unique_lock<std::mutex> usingHeadNode(){return std::unique_lock<std::mutex>(headMutex);}

我的目标是提供一个简单的辅助函数,它返回一个包装互斥锁的 unique_lock,以便我的调用代码可以

auto headGuard = usingHeadNode();

使用 RAII 技术锁定互斥锁。但是编译这个会产生一个错误

错误:使用删除函数 'std::lock_guard<_mutex>::lock_guard(const std::lock_guard<_mutex>&) [使用 _Mutex = std::mutex]

... 看起来 lock_guard 类的构造函数丢失了还是什么?据我所知,我还没有删除任何东西...


更新更多上下文:

我的简单类是一个链表,我想添加一个涉及覆盖保存的头指针的节点,所以我相信我需要锁定它以使其安全修改。来自该 add 函数的片段(无法共享完整代码,因为它是一项任务):

// [...]
Node * pNewNode = new Node(value);
    
//Link it in by prepending
std::unique_lock<std::mutex> pHeadGuard(headMutex); //= usingHeadNode();
pNewNode->prev = nullptr; //since we prepend and this is the new head,there is no 'prevIoUs' element
pNewNode->next = pHead; //what was the head Now comes after the new node
// [...]

pHead = pNewNode; // this is why we needed the mutex

我想通过以某种方式将锁定行包装在函数调用中来将其更改为更具可读性的内容

解决方法

您的问题是 std::unique_lock is movable but not copyable。了解语义后,您就可以了解为什么您的代码不起作用 - 而且,您可以决定这种技术是否合适,或者是否容易出错。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。