通过指针将堆栈分配的对象传递给在另一个线程上执行的函数

Exa*_*gon 1 c++ multithreading c++11

据我所知,线程共享堆内存但有自己的堆栈.因此,如果我通过指针(出于多态的原因)将堆栈分配的对象传递给在另一个线程上执行的函数,这将是安全的,还是会得到未定义的行为.例如这段代码:

struct Foo{
    int counter{0};
}

void bar(Foo * obj){
    obj->counter++;
}
int main(){
   {
        Foo foo_object;
        std::thread t(bar, &foo_object);
        t.detach();
    }
    //do more stuff
}
Run Code Online (Sandbox Code Playgroud)

这是不安全的,因为在foo_object超出范围后,指针foo_object将无效,但线程可以访问无效的内存?我有强烈的感觉,这是产生不确定的行为,但我不是100%肯定.

Nat*_*ica 5

不,这不安全.一旦你到了}

{
    Foo foo_object();
    std::thread t(bar, &foo_object);
    t.detach();
}
Run Code Online (Sandbox Code Playgroud)

foo_object将超出范围,您将在分离的线程中留下悬空指针.由于我们不知道线程何时会实际启动,因此当您使用它时,基于堆栈的本地对象已经被破坏是完全合理的.


另请注意,这Foo foo_object();是一个函数声明而不是局部变量.拥有你需要的变量Foo foo_object;.