类函数+线程

时间:2014-05-07 05:39:52

标签: c++ multithreading class

我已经在网上搜索了,但我一无所获。

我知道组装的源代码(例如c ++)在启动时不会复制到虚拟内存。实际上,当我创建一个新的类实例时,会在内存中创建一个新的变量实例,但类程序代码仍然保留在只读内存中(例如硬盘或闪存),因此只有一个程序代码用于X类(? )。

现在我将这些类放入2个新线程中。因此,如果我同时以异步模式启动两个线程并启动该类中声明的函数,这是否意味着我同时调用了SAME函数?

示例:

class test
{
   int _test()
   {
      int temp = 0;
      temp += 1; // thread 2 would call this ..
      temp = temp / 2; // .. while thread 1 is already here which means temp+=1 was called twice - (0+1+1)/2 = 1 !!
   }
};

int main()
{
   test test1;
   test test2;

   new_async_thread(test1._test());
   new_async_thread(test2._test());
}

3 个答案:

答案 0 :(得分:2)

不,每个线程都有自己的堆栈,temp是堆栈分配的变量,因此它不会在两个线程之间共享。同样,两个线程将具有来自同一函数的两个单独的返回值,尽管在函数中执行的指令执行相同的操作 - 只是变量temp的不同实例。

答案 1 :(得分:2)

该功能的代码将是相同的。但声明的参数局部变量将被放置在单独的堆栈空间中。因此, SAME 代码将在不同数据上运行。

答案 2 :(得分:1)

我相信你有一个基本的误解。

自动局部变量是函数的调用的本地变量或属于该函数的调用。每个变量都有自己的存储 - 在函数内部没有"#34; - 他们共享的是源代码中的名称 因此每个函数调用都有自己完全独立的局部变量 这使得函数可重入,这意味着可以在自身中间调用函数,而不会影响当前调用的结果。
Reentrancy支持多线程和递归。

所以你 调用相同的函数,但是每个函数都计算自己的temp值(为0)。