如何初始化已经在 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_locks(但只有其中一个可以同时锁定互斥锁)。

所以,我将按如下方式实现您的类:

#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++ 中声明的唯一锁?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C++ 中声明和初始化 2d int 向量?

c++ stl 声明对象的同时如何初始化?

C++中内存分配问题

在 C++ 中初始化对象之前声明一个对象

如何在构造函数中初始化 C++ 对象成员变量?

在 C++ 中循环初始化和动态声明随机实体的多个变量