【发布时间】:2012-07-06 07:47:58
【问题描述】:
我是 C++ 线程的新手,我试图清楚地了解内存是如何在线程之间共享/不共享的。我在 C++11 中使用std::thread。
根据我在其他 SO 问题上阅读的内容,stack 内存仅由一个线程拥有,heap 内存在线程之间共享。因此,根据我对堆栈与堆的理解,以下应该是正确的:
#include <thread>
using namespace std;
class Obj {
public:
int x;
Obj(){x = 0;}
};
int main() {
Obj stackObj;
Obj *heapObj = new Obj();
thread t([&]{
stackObj.x++;
heapObj->x++;
});
t.join();
assert(heapObj->x == 1);
assert(stackObj.x == 0);
}
如果我搞砸了一堆东西,请原谅我,lambda 语法对我来说很新。但希望我正在尝试做的是连贯的。 这会按我的预期执行吗?如果不是,我误会了什么?
【问题讨论】:
-
前提有点不对。堆栈内存不是线程本地的,它可以在线程之间共享。
-
请查看此链接以获得更详细的答案:candrews.net/blog/2011/07/understanding-c-0x-lambda-functions - 因为您使用了
[&],所以所有变量都是引用的,所以两个计数器都是1。如果您使用[=],您的断言会成功。 -
@juanchopanza 我的错,我知道线程局部具有特定含义(尽管我不完全确定它是什么),所以我改变了我的问题。这就是“前提”的问题吗?
-
问题是栈内存不属于一个线程,它可以被任意数量的线程访问。
标签: c++ multithreading memory heap-memory stack-memory