线程如何能够访问此变量

时间:2013-11-25 00:00:16

标签: c++

我正在使用以下代码

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()如何访问类变量。

1 个答案:

答案 0 :(得分:2)

您正在将this指针传递给线程。一个指针,可以指向任意位置,在这种情况下,它将指向堆栈。这在理论上有效,但非常不安全。

请考虑以下代码:

if (...) 
{
    foo f;
}

会发生什么?

  1. 输入if-block的范围
  2. foo实例在堆栈上初始化
  3. 线程以指向堆栈的foo*开头
  4. if-block的范围是
  5. 因此f被破坏/删除,并且包含它的空间(堆栈)可能被解除分配。
  6. 现在虽然线程可以在几秒钟内完美运行,但在那个小小的时间之后你会遇到很大的麻烦,因为线程使用的this指针现在无效。非常糟糕!