我有一個包含一個線程函數,其僞代碼看起來像一個執行DLL函數調用:Ç - 中斷其在線程
volatile BOOL stopped = FALSE;
void StopEverything()
{
/* Enter critical section */
stopped = TRUE;
/* Leave critical section */
}
void workerThreadFunc()
{
Initialize();
/* Checkpoint 1 */
if(stopped)
{
/* Do cleanup */
return;
}
doLaboriousTask1();
/* Checkpoint 2 */
if(stopped)
{
/* Do cleanup */
return;
}
doLaboriousTask2();
Uninitialize();
}
而且在使用這個DLL的代碼,清理函數看起來像:
void cleanup()
{
StopEverything();
/* Wait for all threads to exit */
/* Do other cleanup */
}
我的問題是雙重的:
- 有沒有更好的辦法從31e停止我的
workerThreadFunc()
執行而不是在各個檢查點進行這種檢查? - 假設
workerThreadFunc()
卡在doLaboriousTask2()
裏面,主應用程序調用StopEverything()
。有沒有辦法中斷doLaboriousTask2()
並立即退出?
謝謝!
根據上下文的不同,一種選擇可能是將繁重的任務分解成單獨的進程,然後可以隨意終止。 – 2013-03-22 01:43:10
@HarryJohnston,由於更昂貴的上下文切換,不會有單獨的進程顯着增加開銷? – 2013-03-22 04:59:06
通常,進程上下文切換不會顯着增加開銷,特別是在具有多個CPU核心的系統上。但是你需要描述你的特定場景才能確定。 – 2013-03-22 07:42:59