1

我试图通过使用互斥锁来保护一段代码。由于代码崩溃,我在下面创建了一个简单的测试代码,它的作用相同。崩溃不一定每次都在同一行代码上,但总是围绕“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);
}
4

1 回答 1

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 析构函数文档:

销毁线程对象。如果 *this 仍有关联的运行线程(即 joinable() == true),则调用 std::terminate()。

于 2013-12-13T15:05:54.647 回答