2

次のことを行う std::thread を開始するプログラムがあります: X をスリープさせ、関数を実行し、終了します。

create std::thread(Xms, &func)
  wait Xms
  then do func()
  end

たとえば、 std::thread にシグナルを送信して、スリープを即座に中断して func を実行してから終了できるかどうか疑問に思っていました。

これを実行するには、シグナルを std::thread::id に送信する必要がありますか?

私のスレッドは、ラムダ関数を使用してこのように起動されます。

template<typename T, typename U>
void                          execAfter(T func, U params, const int ms)
{
  std::thread                 thread([=](){
      std::this_thread::sleep_for(std::chrono::milliseconds(ms));
      func(params);
    });
  thread.detach();
}
4

3 に答える 3

2

コメントで指摘されているように、これはそもそも問題を解決するための最も賢明なアプローチではありませんでした。適切な中断メカニズムの実装は非常に複雑で、非常に間違いやすいため、回避策の提案を次に示します。

タイムアウト全体でスリープする代わりに、必要な期間が経過するまで、固定された小さいサイズ (たとえば 10 ミリ秒) のスリープをループします。各スリープの後、割り込みが要求されたかどうかをアトミック フラグで確認します。これは汚い解決策ですが、プルするのが最も速いです。

または、各スレッドに を指定し、 を実行する代わりに、そのスレッドに対して acondition_variableを実行しwaitますthis_thread::sleep。中断の要求を示すために条件変数を通知します。おそらく、偽のウェイクアップから保護するために追加のフラグが必要になるでしょう。

于 2013-06-03T14:34:42.870 に答える