簡體   English   中英

WaitForSingleObject崩潰

[英]WaitForSingleObject Crash

我試圖通過使用互斥來保護一段代碼。 由於代碼崩潰,我在下面創建了一個簡單的測試代碼,其作用相同。 崩潰不一定每次都在同一行代碼上,而是總是在“ WaitForSingleObject”或“ Sleep”調用周圍。

任何援助將不勝感激。

#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);
}

問題是您沒有在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析構函數文檔:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM