オブジェクトの有効期間が単に のスコープにバインドされている場合main
、それは簡単です。オブジェクトを破棄する前に、すべてのスレッドを停止して結合したことを確認してください。これは、スコープ内のスマート ポインターを使用してオブジェクトを管理するmain
か、より簡単に、オブジェクトに自動有効期間を与えることによって、より適切に適用できmain
ます。
void thread_func(Cdefine *);
int main()
{
Cdefine thing;
thing.Init();
std::thread thread1(thread_func, &thing);
std::thread thread2(thread_func, &thing);
// do stuff
thread1.join();
thread2.join();
// Now it's safe to destroy the object
}
オブジェクトをスレッドのスコープよりも広いスコープに単純にバインドできない、より複雑な状況では、std::shared_ptr
(またはstd::tr1::shared_ptr
2011boost::shared_ptr
年より前の言語で立ち往生している場合は) オブジェクトを管理することを検討できます。例えば:
void thread_func(std::shared_ptr<Cdefine> p);
void spawn_threads()
{
std::shared_ptr<Cdefine> p = std::make_shared<Cdefine>();
p->Init();
std::thread thread1(thread_func, p);
std::thread thread2(thread_func, p);
thread1.detach();
thread2.detach();
// The threads can carry on doing their thing, and it's safe to
// drop our shared pointer. The object will be deleted when the
// last thread drops its pointer to it.
}
余談ですがInit
、オブジェクトを構築した後に関数を呼び出す必要があるのはなぜですか? それがコンストラクターの目的であるため、コンストラクターで初期化しないのはなぜですか?