关于 std::mutex 使用指针或引用来访问它

std::mutex 是 C++11 中的一个互斥量,用于保护共享数据的访问。std::mutex 可以被引用,但是需要注意,std::mutex 是一个类,而不是一个变量,所以需要使用指针或引用来访问它。123

如果您需要使用 std::mutex,您需要包含 头文件。

当多个线程需要访问共享数据时,您可以使用 std::mutex 来保护共享数据的访问。例如,如果您有一个共享变量 x,您可以使用 std::mutex 来保护它的访问。在访问 x 之前,您可以使用 std::lock_guardstd::mutex 对象锁定互斥量,以确保只有一个线程可以访问 x。例如:

std::mutex mtx;
int x = 0;

void add_to_x(int n) {
    std::lock_guard<std::mutex> lock(mtx);
    x += n;
}

在上面的代码中,我们定义了一个互斥量 mtx 和一个共享变量 x。在 add_to_x 函数中,我们使用 std::lock_guardstd::mutex 对象 lock 来锁定互斥量 mtx。这样,在任何时候,只有一个线程可以访问 x。

std::mutex 在一个类中被定义为private,如何在另外一个类中被引用?

如果您需要在另一个类中引用一个类中的私有成员,您可以使用友元类。友元类是指一个类可以访问另一个类的私有成员。要将另一个类声明为友元类,请在该类的声明中使用 friend 关键字。例如:

class A {
private:
    std::mutex mtx;
    friend class B;
};

class B {
public:
    void foo(A& a) {
        std::lock_guard<std::mutex> lock(a.mtx);
        // do something with a
    }
};

在上面的代码中,我们定义了两个类 A 和 B。在 A 中,我们定义了一个私有成员 mtx。在 B 中,我们定义了一个公共函数 foo,该函数接受一个 A 对象作为参数,并使用 std::lock_guardstd::mutex 对象 lock 来锁定 A 中的 mtx。由于 B 是 A 的友元类,所以它可以访问 A 中的私有成员 mtx。

不用友元类 还有其他方法 类B 可以访问类A 中的 std::mutex mtx 吗?

除了使用友元类,还有其他方法可以让类 B 访问类 A 中的 std::mutex mtx。例如,您可以将 std::mutex 对象作为参数传递给类 B 的函数,或者将 std::mutex 对象作为类 B 的成员变量。例如:

class A {
private:
    std::mutex mtx;
public:
    void foo(B& b) {
        b.bar(mtx);
    }
};

class B {
public:
    void bar(std::mutex& mtx) {
        std::lock_guard<std::mutex> lock(mtx);
        // do something with mtx
    }
};

在上面的代码中,我们定义了两个类 A 和 B。在 A 中,我们定义了一个私有成员 mtx,并定义了一个公共函数 foo,该函数接受一个 B 对象作为参数,并将自己的 mtx 作为参数传递给 B 的 bar 函数。在 B 中,我们定义了一个公共函数 bar,该函数接受一个 std::mutex 对象作为参数,并使用 std::lock_guardstd::mutex 对象 lock 来锁定该对象。这样,在任何时候,只有一个线程可以访问 mtx。

说明下 std::mutex不允许拷贝构造,也不允许 move 拷贝

是的,您是正确的。std::mutex 不允许拷贝构造,也不允许 move 拷贝。这是因为 std::mutex 是一个互斥量,它的目的是保护共享资源免受并发访问。如果您允许拷贝或移动 std::mutex,那么您可能会在多个线程之间共享互斥量,这可能会导致竞争条件和死锁。因此,std::mutex 只能通过引用或指针传递。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值