如何初始化已经在 C++ 中声明的唯一锁?
Posted
技术标签:
【中文标题】如何初始化已经在 C++ 中声明的唯一锁?【英文标题】:how to initialize a unique lock that has already been declared in c++? 【发布时间】:2021-04-29 02:53:06 【问题描述】:我创建了一个类,并将一组唯一锁和一组互斥锁声明为私有变量。 我的问题是如何在类的构造函数中连接它们两者?
头文件:
#include <iostream>
#include <mutex>
#include <string>
#define PHILO_NUM 5
class philosophers
private:
std::mutex _mu[5];
std::unique_lock<std::mutex> _fork[5], _screen;
std::mutex _screenMutex;
public:
philosophers();
;
c++ 文件:
#include "philosophers .h"
philosophers::philosophers()
for (int i = 0; i < PHILO_NUM; i++)
// Somehow connect this->_forks[i] and this->_mu[i]
// At the end connect this->_screen and this->_screenMutex
【问题讨论】:
std::unique_lock
是 reassignable,所以你甚至不需要初始化它们。
如何以不会给我任何错误的方式重新分配它
【参考方案1】:
要说你应该做什么并不容易,因为你不说你想做什么。我认为你混合了锁和互斥锁。没有理由共享锁(正如您在此处尝试所做的那样)。您需要共享互斥锁,但一个互斥锁可以关联任意多个std::unique_lock
s(但只有其中一个可以同时锁定互斥锁)。
所以,我将按如下方式实现您的类:
#include <mutex>
constexpr size_t PHILO_NUM = 5;
class philosophers
private:
std::mutex _mu[PHILO_NUM];
std::mutex _screenMutex;
public:
philosophers() = default; // Nothing to do here
std::unique_lock grab_fork(size_t index)
return std::unique_lock (_mu[index]);
;
因此,如果有人抓住了叉子,只要他们持有该叉子的锁,他们就可以使用它。使用示例如下所示:
philosophers p;
void eat()
auto lock = p.grab_fork(3);
// Now I can eat
lock.unlock(); // Not really necessary, lock will release the mutex, when it is destroyed at the end of the scope
【讨论】:
以上是关于如何初始化已经在 C++ 中声明的唯一锁?的主要内容,如果未能解决你的问题,请参考以下文章