スレッドの共有メモリは分かっていますが、独自のスタックを持っています。 したがって、スタックで割り当てられたオブジェクトを別のスレッドで実行される関数に(多態的な理由で)ポインタを介して渡すと、これは安全になるか、未定義の動作になります。たとえば、このコード:foo_object
がスコープ外になった後、foo_object
へのポインタが無効になりますが、スレッドが無効なメモリにアクセスする可能性があるため他のスレッドで実行される関数へのポインタによってスタック割り当てオブジェクトを渡す
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
}
は、この安全ではありませんか? 私は強い感情を持っています、これは未定義の行動を生み出しますが、私は100%確信していません。
100%確実ではない理由は何ですか? –
「安全な」とは「正しい」という意味ですか? –
はい私は正しかったという意味で安全であることを意味していますが、これは明らかでない場合はごめんなさい – Exagon