class 部分的互斥锁
Mutex on part of class
是否可以在 class 的部分使用互斥体?
赞:
class A{
int a;
int b;
boost::mutex Mutex_for_a;
boost::mutex Mutex_for_b;
}
然后使用正确的互斥锁执行正确的操作。
我知道这在技术上是可行的,但我不知道它是否会导致问题。
I know this is technically possible but I don't know if it can lead to problems.
这当然是可能的。但是,如果处理不当,类似这样的事情可能会导致死锁:
A::use_a() { std::lock_guard lck{ Mutex_for_a }; use_b(); ... }
A::use_b() { std::lock_guard lck{ Mutex_for_b }; use_a(); ... }
所以你必须确保如果你的 class 设计允许同时锁定两个互斥锁,那么锁定顺序在任何地方都是一致的(或者更好地使用 std::scoped_lock
)。
是的,这是可能的。唯一要注意的是它将是特定于对象的。
您不应该锁定一个互斥锁并等待另一个互斥锁,这可能会导致死锁情况。
Is it possible to use mutex on parts of a class ?
您没有在 上使用任何互斥体。互斥量是您的线程可以 "lock" 和 "unlock," 的东西,它不会让多个线程同时锁定它。即 全部。互斥量不知道 为什么 你的线程锁定它。互斥量不知道也不关心您的代码与它关联的对象或数据。
class A{
int a;
int b;
boost::mutex Mutex_for_a;
boost::mutex Mutex_for_b;
}
这可能有道理,也可能没有。如果不查看您的线程如何使用 a
和 b
,就无法判断。使用互斥量的主要原因是为了防止其他线程在其他线程正在更改它时看到某些处于不一致或无效状态的数据集合。
如果您要保护的 "collection of data" 包含在单个 int
变量中,通过将其设为 std::atomic<int>
来共享它可能更有意义,而忘记互斥锁。
另一方面,如果 a
和 b
之间存在一些重要的 关系 ,那么您应该使用 单一互斥来保护这种关系。
是否可以在 class 的部分使用互斥体?
赞:
class A{
int a;
int b;
boost::mutex Mutex_for_a;
boost::mutex Mutex_for_b;
}
然后使用正确的互斥锁执行正确的操作。 我知道这在技术上是可行的,但我不知道它是否会导致问题。
I know this is technically possible but I don't know if it can lead to problems.
这当然是可能的。但是,如果处理不当,类似这样的事情可能会导致死锁:
A::use_a() { std::lock_guard lck{ Mutex_for_a }; use_b(); ... }
A::use_b() { std::lock_guard lck{ Mutex_for_b }; use_a(); ... }
所以你必须确保如果你的 class 设计允许同时锁定两个互斥锁,那么锁定顺序在任何地方都是一致的(或者更好地使用 std::scoped_lock
)。
是的,这是可能的。唯一要注意的是它将是特定于对象的。 您不应该锁定一个互斥锁并等待另一个互斥锁,这可能会导致死锁情况。
Is it possible to use mutex on parts of a class ?
您没有在 上使用任何互斥体。互斥量是您的线程可以 "lock" 和 "unlock," 的东西,它不会让多个线程同时锁定它。即 全部。互斥量不知道 为什么 你的线程锁定它。互斥量不知道也不关心您的代码与它关联的对象或数据。
class A{ int a; int b; boost::mutex Mutex_for_a; boost::mutex Mutex_for_b; }
这可能有道理,也可能没有。如果不查看您的线程如何使用 a
和 b
,就无法判断。使用互斥量的主要原因是为了防止其他线程在其他线程正在更改它时看到某些处于不一致或无效状态的数据集合。
如果您要保护的 "collection of data" 包含在单个 int
变量中,通过将其设为 std::atomic<int>
来共享它可能更有意义,而忘记互斥锁。
另一方面,如果 a
和 b
之间存在一些重要的 关系 ,那么您应该使用 单一互斥来保护这种关系。