我已经在网上搜索了,但我一无所获。
我知道组装的源代码(例如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());
}
答案 0 :(得分:2)
不,每个线程都有自己的堆栈,temp
是堆栈分配的变量,因此它不会在两个线程之间共享。同样,两个线程将具有来自同一函数的两个单独的返回值,尽管在函数中执行的指令执行相同的操作 - 只是变量temp
的不同实例。
答案 1 :(得分:2)
该功能的代码将是相同的。但声明的参数和局部变量将被放置在单独的堆栈空间中。因此, SAME 代码将在不同数据上运行。
答案 2 :(得分:1)
我相信你有一个基本的误解。
自动局部变量是函数的调用的本地变量或属于该函数的调用。每个变量都有自己的存储 - 在函数内部没有"#34; - 他们共享的是源代码中的名称
因此每个函数调用都有自己完全独立的局部变量
这使得函数可重入,这意味着可以在自身中间调用函数,而不会影响当前调用的结果。
Reentrancy支持多线程和递归。
所以你 调用相同的函数,但是每个函数都计算自己的temp
值(为0)。