class temp
{
boost::mutex mx;
void CriticalCode() {
boost::mutex::scoped_lock scoped_lock(mx);
//Do Something
return;
}
}
如果在堆上分配此类(temp* T = new temp()
),这是否是线程安全的(对于每个实例,并非所有实例一起)?
如果我制作boost::mutex mx
- > boost::mutex* mx
,并在构造函数中分配它,以便它将在堆上分配,代码是否也是线程安全的?
如果对1和2的答案为否,我如何才能使每个实例线程安全?
答案 0 :(得分:8)
1)如果在堆上分配此类(temp * T = new temp()),这是否是线程安全的(对于每个实例,并非所有实例都在一起?
是。由于mx不是类的静态成员,因此每个类的实例将有一个锁。
2)如果我制作boost :: mutex mx - > boost :: mutex * mx,并在构造函数中分配它,以便它将在堆上分配,代码是否也是线程安全的?
是。但是线程安全只能基于每个实例。
3)如果现在回答1和2,我怎样才能使每个实例线程安全?
答案是肯定的,所以你很好。
如果有其他人想知道如何使用一个锁使所有实例的线程安全 - 您可以使mx成为该类的静态变量。
答案 1 :(得分:3)
存储位置与任何事情无关。
答案 2 :(得分:0)
是的,方法CriticalCode()
在两种情况下都是线程安全的。