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%肯定.
不,这不安全.一旦你到了}中
{
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;.