我正在使用以下代码
class foo
{
private:
int val;
public:
void someMethod()
{
std::cout << val ;
}
foo()
{
val = 12;
boost::thread t(&foo::someMethod,this);
}
};
我正在以以下方式访问此类:
foo f;
现在,据我了解,f的所有成员变量都是在堆栈上创建的。
从this线程中,我知道线程共享程序的同一堆,但是每个线程都有自己的堆栈空间。我想知道在自己线程中运行的someMethod()如何访问类变量。
最佳答案
您正在将this
指针传递给线程。指针可以指向任意位置,在这种情况下,它将指向堆栈。从理论上讲这是可行的,但是非常不安全。
考虑以下代码:
if (...)
{
foo f;
}
会发生什么?
输入if块的范围
foo
实例在堆栈上初始化线程以
foo*
开头指向堆栈保留if块的范围
因此,
f
会被破坏/删除,并且可能会释放包含它的空间(堆栈)。现在,尽管线程可能完美地运行了几微秒,但经过很少的时间,您会遇到大的大麻烦,因为该线程使用的
this
指针现在无效。很坏!关于c++ - 线程如何访问此变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20182733/