线程:不同的类实例是否提供了自己的成员函数副本?

时间:2015-07-14 06:06:36

标签: c++ multithreading

这是我的代码:

class carl{
    public:
    int x;

    carl(int y):x(y){

    }       

    void compute(){
        x++;                    
    }
};


int main () {

    carl c(5);                  //init
    carl c2(5);                 //init

     std::thread t1([&](){

        for(int i = 0 ; i <50;i++)
            c.compute();
        }
    );


     std::thread t2([&](){

        for(int i = 0 ; i <50;i++)
            c2.compute();
        }
    );

    t1.join();              //join
    t2.join();              //join


    std::cout<<c.x<<std::endl;
    std::cout<<c2.x<<std::endl;



    return 0;
}

输出

55
55

我知道数据竞争,如果两个线程都访问相同的资源,他们应该受到保护。但是,如果它是这样的话呢?我创建了两个名为carlc c2的实例,他们有自己的resources。我创建了两个访问自己计算的线程。我的问题是:

  1. 因为两个线程都会严格访问自己的资源,这个线程是否安全且不需要锁?
  2. 是否意味着c和c2正在访问的计算函数具有不同的函数地址?
  3. 奖金问题: 我打算实现多客户端文件传输。我的tcp ip是使用阻塞i / o和每个连接一个监听器实现的。我觉得使用锁定保护可能会减慢进程,因为一切都会排队。有什么好的算法/方法吗?

3 个答案:

答案 0 :(得分:4)

  

因为两个线程都会严格访问自己的资源,这个线程是否安全且不需要锁?

是的,这是正确的。

  

是否意味着c和c2正在访问的计算函数具有不同的函数地址?

没有。不需要复制函数,因为每个函数调用都是独立的。只要它们操作的数据不在线程之间共享,就没有问题。

答案 1 :(得分:3)

  1. 是的,它是线程安全的,不需要锁定。他们没有访问相同的资源,因此没有任何数据竞争。您似乎理解这个概念,但是不愿意将其应用到您的代码中。为什么犹豫不决?

  2. 不一定。它们可以执行相同的功能(也就是说,两个线程的程序计数器可能会跳转到内存中的相同函数来执行)。

  3. 至于你的奖金问题......为此开了一个新问题......

答案 2 :(得分:1)

我会添加另一个回复,因为我发现对第2点的回复不满意。

  
      
  1. 既然两个线程都会严格访问自己的资源,这个线程是否安全且锁定是否必要?
  2.   

  
      
  1. 是否意味着c和c2正在访问的计算函数具有不同的函数地址?
  2.   

不,功能总是一样的。对于&#39;这个&#39;它们将有两个不同的值。指针,因此将对不同的数据采取行动

相关问题