互斥体作为类成员

时间:2011-05-10 08:10:22

标签: c++ multithreading boost mutex

 class temp
 {
    boost::mutex mx;
    void CriticalCode() {
        boost::mutex::scoped_lock scoped_lock(mx); 
        //Do Something
        return;
    }
 }
  1. 如果在堆上分配此类(temp* T = new temp()),这是否是线程安全的(对于每个实例,并非所有实例一起)?

  2. 如果我制作boost::mutex mx - > boost::mutex* mx,并在构造函数中分配它,以便它将在堆上分配,代码是否也是线程安全的?

  3. 如果对1和2的答案为否,我如何才能使每个实例线程安全?

3 个答案:

答案 0 :(得分:8)

1)如果在堆上分配此类(temp * T = new temp()),这是否是线程安全的(对于每个实例,并非所有实例都在一起?

是。由于mx不是类的静态成员,因此每个类的实例将有一个锁。

2)如果我制作boost :: mutex mx - > boost :: mutex * mx,并在构造函数中分配它,以便它将在堆上分配,代码是否也是线程安全的?

是。但是线程安全只能基于每个实例。

3)如果现在回答1和2,我怎样才能使每个实例线程安全?

答案是肯定的,所以你很好。

如果有其他人想知道如何使用一个锁使所有实例的线程安全 - 您可以使mx成为该类的静态变量。

答案 1 :(得分:3)

存储位置与任何事情无关。

答案 2 :(得分:0)

是的,方法CriticalCode()在两种情况下都是线程安全的。