6

用于本地数组和与线程交互的 C++98 和 C++11 内存模型是什么?

不是指 C++11 thread_local关键字,它与全局和静态变量有关。

相反,我想找出在编译时分配的数组的线程保证行为是什么。编译时我的意思是“int array[100]”,这与使用new[]关键字的分配不同。我不是指静态变量。

例如,假设我有以下结构/类:

struct xyz { int array[100]; };

和以下功能:

void fn(int x) {
  xyz dog;
  for(int i=0; i<100; ++i)  { dog.array[i] = x; }
  // do something else with dog.array, eg. call another function with dog as parameter
  }

从多个线程调用fn()是否安全?看来C++内存模型是:所有局部非静态变量和数组都分配在栈上,每个线程都有自己的栈。这是真的吗(即这是标准的正式一部分)?

4

2 回答 2

9

这样的变量是在栈上分配的,因为每个线程都有自己的栈,所以使用本地数组是完全安全的。它们与例如 local ints 没有什么不同。

于 2013-03-05T07:10:17.020 回答
3

C++98 没有提到线程。用 C++98 编写但使用线程的程序没有 C++98 定义的含义。当然,线程扩展为线程提供稳定的、私有的局部变量是明智的,而且它们通常会这样做。但是可能存在不是这种情况的线程:例如,vfork在某些 Unix 系统上创建的进程,父子进程将在同一个堆栈帧中执行,因为vinvfork意味着不克隆地址空间,并且vfork不将新进程重定向到不同的函数。

在 C++11 中,有线程支持。单独 C++11 线程中单独激活链中的局部变量不会干扰。但是,如果您跳出该语言并抽出vfork或类似的东西,那么所有赌注都将像以前一样。

但这里有一些东西。C++ 现在有闭包。如果两个线程都调用同一个闭包怎么办?然后你有两个线程共享相同的局部变量。闭包就像一个对象,它捕获的局部变量就像成员。如果两个或多个线程调用同一个闭包,那么你就有一个事实上的多线程对象,其成员(即捕获的词法变量)是共享的。

一个线程也可以简单地将其局部变量的地址传递给另一个线程,从而使它们成为共享的。

于 2013-03-05T07:21:23.380 回答