2

是否可以在类的一部分上使用互斥锁?

喜欢 :

class A{
    int a;
    int b;
    boost::mutex Mutex_for_a;
    boost::mutex Mutex_for_b;
}

然后使用正确的互斥锁执行正确的操作。我知道这在技术上是可行的,但我不知道它是否会导致问题。

4

3 回答 3

4

我知道这在技术上是可行的,但我不知道它是否会导致问题。

这当然是可能的。但是,如果不小心处理,这样的事情可能会导致死锁:

A::use_a() { std::lock_guard lck{ Mutex_for_a }; use_b(); ... }
A::use_b() { std::lock_guard lck{ Mutex_for_b }; use_a(); ... }

因此,您必须确保如果您的类设计允许同时锁定两个互斥锁,则锁定顺序在任何地方都是一致的(或更好地使用std::scoped_lock)。

于 2018-05-15T10:38:22.677 回答
1

是否可以在类的一部分上使用互斥锁?

您不会任何东西上使用互斥锁。互斥锁是您的线程可以“锁定”和“解锁”的东西,它不会让多个线程同时锁定它。就是这样。互斥锁不知道为什么您的线程会锁定它。互斥体不知道也不关心您的代码与哪些对象或数据相关联。

class A{ int a; int b; boost::mutex Mutex_for_a; boost::mutex Mutex_for_b; }

这可能有意义,也可能没有。如果不查看您的线程如何使用ab. 使用互斥锁的主要原因是防止其他线程看到某些数据集合处于不一致或无效状态,而其他线程正在更改它。

如果您要保护的“数据集合”包含在单个int变量中,则通过将其设为 a 来共享它可能更有意义std::atomic<int>,而忘记互斥锁。

另一方面,如果 和 之间有一些重要的关系,那么您应该使用单个互斥锁来保护这种关系。ab

于 2018-05-15T14:01:58.873 回答
0

对的,这是可能的。唯一要注意的是它将是特定于对象的。您不应该锁定一个 mutext 并等待另一个,这可能导致死锁情况。

于 2018-05-15T12:25:50.283 回答