我正在使用以下代码

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/

10-11 23:18
查看更多