メインスレッドがワーカースレッドを待機できるように、同期オブジェクト(イベント、ロック、ミューテックス、セマフォ、クリティカルセクションなど)などを介してスレッドを同期することをお勧めします。
ここに競合状態があります: 条件が評価された直後で、if
DB 操作が実行される前に、シャットダウン フラグが発生した場合はどうなるでしょうか?
これは、よく知られた同期プリミティブとしてミューテックスを使用した図ですが、もっと良い方法があります。
メインスレッド:
int main() {
... wait for signal to exit the app
// the DB operations are running on another thread
...
// assume that we start shutdown here
// also assume that there is some global mutex g_mutex
// following line blocks if mutex is locked in worker thread:
std::lock_guard<std::mutex> lock(g_mutex);
Cleanup(); // should also ensure that worker is stopped
}
ワーカー スレッド:
void MyWorkerThread::RunMethod()
{
{
std::lock_guard<std::mutex> lock(g_mutex);
DoSomethingOnDB();
}
// some other, non locked execution which doesn't prevent
// main thread from exiting
...
{
std::lock_guard<std::mutex> lock(g_mutex);
DoSomethingMoreOnDB();
}
}
すべてのロックを繰り返したくないのは明らかなので、ラップする必要があります。
void MyWorkerThread::RunMethod()
{
Execute(DoSomethingOnDB);
...
Execute(DoSomethingMoreOnDB);
}
void MyWorkerThread::Execute(DatabaseFn fn)
{
std::lock_guard<std::mutex> lock(g_mutex);
fn();
}