是否可以在类的某些部分上使用互斥锁?
喜欢:
class A{
int a;
int b;
boost::mutex Mutex_for_a;
boost::mutex Mutex_for_b;
}
然后使用正确的互斥锁执行正确的操作。 我知道这在技术上是可行的,但我不知道它是否会导致问题。
这在技术上是可行的,但我不知道它是否会导致问题。
这当然是可能的。但是,如果不小心处理,这样的事情可能会导致死锁:
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
)。
是否可以在类的某些部分使用互斥锁?
您不会对任何东西使用互斥锁。互斥锁是线程可以"锁定"和"解锁"的东西,它不会让多个线程同时锁定它。 仅此而已。 互斥锁不知道为什么您的线程会锁定它。 互斥锁不知道也不关心您的代码与其关联的对象或数据。
class A{ int a; int b; boost::mutex Mutex_for_a; boost::mutex Mutex_for_b; }
这可能有意义,也可能没有。 如果不看到您的线程如何使用a
和b
,就无法判断。使用互斥锁的主要原因是防止其他线程看到某些处于不一致或无效状态的数据集合,而其他线程正在更改它。
如果要保护的"数据集合"包含在单个int
变量中,则通过使其成为std::atomic<int>
来共享它并忘记互斥锁可能更有意义。
另一方面,如果a
和b
之间存在某种重要关系,那么您应该使用单个互斥锁来保护该关系。
是的,这是可能的。唯一的问题是它将是特定于对象的。 您不应该锁定一个多文并等待另一个,这可能会导致死锁情况。