Boost-Threadを使用するC++ 98プロジェクトがあります。メインスレッドは、このような12スレッド作成:スレッドとシグナル
for(int i=0;i<numCPU;++i)
{
vThreads.push_back(new boost::thread(boost::bind(&TControl::startCPU,this,i,fnp)));
}
およびワーカースレッドは、(限りgetWorkとして実行)ワークユニットを返す:
void startCPU(int id,StartFn fnp)
{
unused(id);
while(true)
{
WU_TYPE* pWU(getWork());
if(pWU==NULL) return;
CALL_MEMBER_FN(pWU,fnp)();
}
}
特定のワークユニットは、非常に長い実行してもよいです。目標は、スレッド(startCPU(void)を実行するスレッド)が新しいワークユニットを開始できるように、すでに60分以上のランタイムを持つワークユニットを強制終了することです。
これはシグナルによって実行できると主に考えました。つまり、メインスレッドが毎分シグナルを上げ、各スレッド内のシグナルハンドラが期限切れのワークユニットの例外をスローする可能性があります。しかし、少し読んだ後では、あるスレッドから生成されたシグナルが別のスレッドのシグナルハンドラを起動しないため、このように動作するようには見えません。この目標を達成するための適切な技術は何ですか?
注:C++ 11は使用できません。ソフトウェアは古いシステムでコンパイルする必要があります。
前の開始時刻を覚えておいてください。 - >現在の時刻を確認してください。 - >終了時刻になると終了します。 - >この変数は、このスレッドが終了した作業単位を示します。 – Detonar
CALL_MEMBER_FNは、ワークユニットpWUのメンバ関数ポインタfnpを実行し、ワークユニットが完了するまで戻りません。目標は毎分fnp()を中断し、それが殺されるかどうかを確認することです。 – Geom