C++11 函数返回封装私有互斥锁的锁保护

C++11 函数返回封装私有互斥锁的锁保护,c++11,mutex,C++11,Mutex,我有一个简单的类,其中声明了以下内容: std::mutex headMutex; std::unique_lock<std::mutex> usingHeadNode(){return std::unique_lock<std::mutex>(headMutex);} 使用RAII技术锁定互斥锁。但是,编译此文件会引发错误: 错误:使用已删除的函数 'std::lock\u guard::lock\u guard(const std::lock\u guard&)

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

std::mutex headMutex;  
std::unique_lock<std::mutex> usingHeadNode(){return std::unique_lock<std::mutex>(headMutex);}
使用RAII技术锁定互斥锁。但是,编译此文件会引发错误:

错误:使用已删除的函数 'std::lock\u guard::lock\u guard(const std::lock\u guard&) [使用_Mutex=std::Mutex]

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


更新以了解更多上下文:

我的简单类是一个链表,我想添加一个包含覆盖保存的头指针的节点,所以我认为我需要锁定它以确保修改的安全性。来自该add函数的代码段(无法共享完整代码,因为它是一个赋值):

/[…]
Node*pNewNode=新节点(值);
//通过预先结束链接它
std::唯一锁pHeadGuard(头互斥);/=使用HeadNode();
pNewNode->prev=nullptr//因为我们预先准备好了,而这是新的头,所以没有“先前”元素
pNewNode->next=pHead//新节点之后是什么样的头部
// [...]
pHead=pNewNode;//这就是为什么我们需要互斥

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

您的问题就在于此。了解了语义后,您可以了解代码不起作用的原因,更重要的是,您可以决定这种技术是否合适,或者是否容易出错。

更新了代码以澄清问题。因此IIUC
return obj
实际上复制了obj,而不是返回对它的引用,并且这种类型不允许复制,对吗?我想要unique::lock的作用域自动内存管理,有没有办法在调用函数的作用域中创建它,这样它就可以在最后自动终止?你说你的“类是一个链表”,我想(我希望是这样)您的意思是,您已经正确地封装了链表数据结构以及以您希望的方式在类中对其进行操作的方法。如果是这种情况,那么以这种方式使用锁(从函数返回锁)在可维护性或可读性方面没有优势。每次只需在适当的位置创建它。这是规范的方式,每个人都会理解,你也会理解。在C++11中,返回时的“移动”不是自动的,我认为,这取决于编译器。因此,它必须是可复制的,而事实并非如此。在C++17中,这一点得到了极大的改进,并且需要移动,因此从编译的意义上讲,这可能是“可行的”。(我想。如果你喜欢的话,你可以试一下魔杖盒或锁销。)
auto headGuard = usingHeadNode();
// [...]
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