いくつかのスレッド化チュートリアルを実行しましたが、1 つのことに興味があります。
std::thread Child([](){ std::cout << "When am I executed?" << std::endl << std::endl; });
//Some other code
Child.join();
//I'm guessing now my thread would be running
私が呼び出したときにスレッドが実行されていますjoin()
か、それともスレッドを作成してから join を呼び出したときまでの間にスレッドが実行されていますか? が呼び出されたときに実行される場合join()
、私の理解を確認するために、その部分を実行するように指示し、プログラムはメインスレッドで続行され、最終的に子スレッドはメインスレッドが使用している同じメモリで何らかの作業を行いましたか?
ジェネリック クラスのラッパーを作成したい場合は、以下のようなことをしたいのですが、完全には理解できないようです。メモリの観点からスレッドを管理することに混乱しています。
class Sync {
private:
int val;
public:
Sync() : val(0) {}
void Inc() {val++}
int Value() { return val; }
};
class Async {
private:
Sync Foo;
std::mutex mtx;
std::vector<std::thread*> Children;
public:
//I would need a new thread each time I called Inc
void Inc() {
Children.push_back(new std::thread([&]() {
mtx.lock();
Foo.Inc();
mtx.unlock();
}));
}
//But how do I know when it is safe to delete Child?
int Value() {
for(auto& thds : Children) {
thds->join();
delete thds;
}
Children.clear();
return Foo.Value(); }
};
Child が不要になるため、適切な場所はスレッド関数の最後にあるのではないかと考えていましたが、スレッド自体を破棄しようとするとどうなりますか? 私はそれが聞こえるのと同じくらい悪い考えになると思います. スレッドを削除してもよいかどうかを知るにはどうすればよいですか? より良いアプローチはありますか?
以下の提案を反映するように上記のコードを変更しました。
例外のスローに関してチュートリアルが何について話しているかを理解したので、mtx.lock() ではなくミューテックスガードを使用する必要があります。