2013-12-13 227 views
0

我試圖通過使用互斥鎖來保護一段代碼。由於代碼崩潰,我創建了一個簡單的測試代碼,在其下面執行相同的操作。崩潰不一定每次都在同一行代碼中,但始終圍繞「WaitForSingleObject」或「Sleep」調用。WaitForSingleObject崩潰

任何援助將不勝感激。

#include <thread> 
#include <windows.h> 
#include <process.h> 

static HANDLE myMutex; 

//The function we want to make the thread run. 
void task1() 
{ 

    WaitForSingleObject(myMutex, INFINITE); 

    for (int i = 0; i < 20; i++) 
    { 
     Sleep(500); 
    } 

    ReleaseMutex(myMutex); 
} 

void task2() 
{ 

    Sleep(10); 
    WaitForSingleObject(myMutex, INFINITE); 

    for (int i = 0; i < 20; i++) 
    { 
     Sleep(10); 
    } 

    ReleaseMutex(myMutex); 
} 

int main(int argc, char **argv) 
{ 

    myMutex = CreateMutex(0, FALSE, 0); 

    std::thread t1(task1); 

    std::thread t2(task2); 
} 

回答

4

的問題是,你不等待線程您main方法退出之前退出。 thread對象上的析構函數正在被調用而沒有線程退出。您需要撥打join才能讓您的主要方法等待。嘗試:

int main(int argc, char **argv) 
{ 

    myMutex = CreateMutex(0, FALSE, 0); 

    std::thread t1(task1); 

    std::thread t2(task2); 
    if(t1.joinable()) 
     t1.join(); 

    if(t2.joinable()) 
     t2.join(); 

} 

根據std::thread destructor文檔:

銷燬線程對象。如果*仍然有一個關聯的運行線程(即joinable()== true),則調用std :: terminate()。