2014-07-21 54 views
1

我想寫一個線程正文(說,myThread),它是與父線程同步使用手動重置事件,說g_myThreadEventWaitForSingleEvent是否可以等待事件重置?

myThread使用此事件通知父母它已成功檢索輸入參數。

我想知道父母是否可以重複使用相同的事件來指示myThread退出。

有些東西在下面的幾行:

子:

g_myThreadEvent = UNSIGNALLED. 
myThread() { 
    read_inparam() 
    set(g_myThreadEvent); 
    for(;;) { 
     // do something important 
     if(is_reset(g_myThreadEvent)) break; 
    } 
} 

家長:

start_thread(){ 
    CreateThread(myThread, some_arguments); 
    WaitForSingleobject(g_myThreadEvent, INFINITE); 
} 

stop_thread() { 
    reset(g_myThreadEvent); 
} 

這將使我使用同步線程單一事件,而不是使用單獨的事件來停止線程更簡單的解決方案。

回答

3

事件沒有「is-reset」狀態。然而,他們確實有一個is-set狀態(並且與此相反,未被設置爲)。淨度不耐受(這將是清晰的使用單獨的事件),你的孩子,線程可以簡單地取消當事件不再發出信號:

// in child-infinite-loop. break if event no longer signaled 
if (WaitForSingleObject(g_myThreadEvent, 0) != WAIT_OBJECT_0) 
    break; 

和父線程可以通過重新設置控制此當孩子終止時的事件。一個適當的啓動會是這樣的:

// startup the child thread 
g_myThreadEvent = CreateEvent(NULL, TRUE, FALSE, NULL); 
g_hChildThread = CreateThread(....); 
WaitForSingleObject(g_myThreadEvent, INFINITE); 

和正確的關閉將是:

// signal a shutdown to the running child. 
ResetEvent(g_myThreadEvent); 
WaitForSingleObject(g_hChildThread, INFINITE); 
CloseHandle(g_hChildThread); 

你的父母應確保孩子雙方完成重置事件是很重要的等待子線程手柄上的正確關閉信號。緊張的競賽條件是由於沒有密切關注而產生的。

最後,請注意這隻會每事件句柄一個子線程工作,一個最不方便的限制,如果它不適合您的特定需求。

祝你好運。

+0

如果我從子線程設置g_myThreadEvent並在進入處理循環之前立即重置它,會發生什麼?我假設父母應該在設置g_myThreadEvent時收到通知。 (然後我應該能夠等待從我的子線程設置g_myThreadEvent) –

+1

@s_b您描述的活動是什麼['PulseEvent'](http://msdn.microsoft.com/zh-cn/library/windows /desktop/ms684914(v=vs.85).aspx)是專門設計的。它釋放*活躍*服務員。但是,在孩子開始脈搏時,父母並沒有積極地等待這樣的保證。它有一個自然的競賽條件。父母可以啓動子線程,該子線程通過脈衝運行(沒有父母等待),然後孩子進入循環檢查事件信號,然後父母終於運行,等待相同的事件信號,但現在在那裏沒有人可以發出信號。 – WhozCraig