2013-05-29 25 views
1

在我的常量」 - 我想這就是secondCommand firstCommand‘後,纔可以稱爲’。我試着用EnterCriticalSection的工作,但問題是,從哪裏開始我的鎖 - 如果我這樣做是在構造函數(在#),和「firstCommand」(##處)後解除鎖定,並嘗試獲取再次鎖定「secondCommand」(在###)之前,它可能不是因爲在###工作,即使在鎖被鎖定 - secondCommand仍然可以稱爲 - 因爲鎖定在同一個THEAD計提壞賬(它就像調用兩次在一排「鎖定」和「鎖定」 - 不會有死鎖)。如果我在'firstCommand'(在####)之前鎖定並且在'firstCommand'(在##)之後立即釋放,當檢查鎖是否被鎖定時 - 鎖可以是未初始化的 - 這會導致問題。這裏是我的代碼:EnterCriticalSection的和CRITICAL_SECTION在Windows

myClass::myClass(){ 
    # 
    threadFunction(); 
    ### 
    secondCommand(); 
} 

void myClass::threadFunction(){ 
    DWORD threadID; 
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc,0, 0, &threadID); 
} 

threadFunc(){ 
    #### 
    firstCommand(); 
    ## 
    while(true){}; 
} 

這似乎是一個簡單的問題,但我一直在特林解決了一個小時now.Can誰能幫助?

回答

2

我想你會更好使用事件:看CreateEventSetEventWaitForSingleObject

您可以創建在構造函數時,等待它的「###」,並將其設置在「##」。你應該檢查WaitForSingleObject的返回值;如果成功,它將會是WAIT_OBJECT_0。

1

也許你的問題的本質並不像你張貼的例子一樣簡單,但一個明顯的方法就是做這個

myClass::myClass(){ 
    firstCommand(); 
    threadFunction(); 
    secondCommand(); 
} 

void myClass::threadFunction(){ 
    DWORD threadID; 
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc,0, 0, &threadID); 
} 

threadFunc(){ 
    while(true){}; 
} 

是有一些原因,firstCommand有另一個線程上運行?

編輯
當你需要在後臺線程運行firstCommand,則使用一個事件時,它的安全信號。因此,在myClass定義一個成員變量(或兩個線程某處訪問)的事件處理

HANDLE m_hEvent; 

,並使用它像這樣

myClass::myClass(){ 
    m_hEvent = CreateEvent(NULL, FALSE, FALSE, NULL); 
    threadFunction(); 
    WaitForSingleObject(m_hEvent, INFINITE); 
    secondCommand(); 
    CloseHandle(m_hEvent); 
    m_hEvent = NULL; 
} 

void myClass::threadFunction(){ 
    DWORD threadID; 
    CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)threadFunc,0, 0, &threadID); 
} 

threadFunc(){ 
    firstCommand(); 
    SetEvent(m_hEvent); 
    while(true){}; 
} 

因此,在主線程,secondCommand等待事件在跑步之前發出信號。在工作線程,該事件被設置(信號)firstCommand完成後。

+0

是 - 它創造了必須在其他線程創建的項目... – kakush

+0

@kakush - 不夠公平 - 我已經編輯我的答案來說明如何使用Windows事件對象做到這一點。 –

相關問題