私はC++ 11のスレッドに新たなんだと私は次のように何かをしようとしている:クラスのプライベートメソッドであるデーモンスレッドを開始しますか?
class Something {
public:
void start() {
this->task_ = std::thread(&Something::someTask, this);
this->isRunning_ = true;
this->task_.detach(); // I read detach will stop it from hanging
}
void stop() {
this->isRunning = false;
}
~Something() {
this->stop();
}
private:
std::atomic<bool> isRunning_;
std::thread task_;
void someTask()
{
while(this->isRunning_) {
// do something forever
}
}
};
Something whatever;
whatever.start();
しかし、スレッドがブロックされて取得し続けます。 whatever.start()
が実行された後は何もしません。ループが実行されている間だけハングします。にスレッドの実行を待つことができます設定の同期のいくつかの種類が、ありますしない限り、
を使用してdo_async_untilのコンストラクタにメンバ関数を渡す必要があるメンバ関数を使用してこの作業は 'this-> isRunning_ =この行を入れて作りますtrue; '' this-> task_ = std :: thread(&Something :: someTask、this); 'の上にあります。それ以外の場合は、条件を設定して実行させる前にスレッドループが終了することがあります。 –
@πάνταῥεῖありがとう。ループは何らかの理由ですぐに終了します。 – oldjohn1994
これを閉じるには投票しました。明らかにそれを話題にしない理由は、問題を再現する完全ではあるが最小限のコードが欠けているということです。さらに、トピックは誤解を招き、明らかな競合状態が見出されたが、その後無視され、テキスト中に(観察とは対照的に)あまりにも多くの解釈がある。要約すると、これは他の誰にとっても有用なエントリではありません。 –