首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WaitForSingleObject崩溃

WaitForSingleObject崩溃
EN

Stack Overflow用户
提问于 2013-12-13 15:01:52
回答 1查看 2.2K关注 0票数 1

我试图通过使用互斥保护一段代码。由于代码崩溃,我在下面创建了一个简单的测试代码,它也是这样做的。每次崩溃并不一定在相同的代码行上,但总是围绕着"WaitForSingleObject“或”睡眠“调用。

如能提供任何协助,将不胜感激。

代码语言:javascript
复制
#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);
}
EN

回答 1

Stack Overflow用户

发布于 2013-12-13 15:05:54

问题是,在main方法退出之前,您没有等待线程退出。在没有线程退出的情况下调用thread对象上的析构函数。您需要调用join,以便让您的主要方法等待。尝试:

代码语言:javascript
复制
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::线程析构函数文档:

破坏线程对象。如果*这仍然有一个关联的运行线程(即连接() == true),则调用std::terminate()。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20569542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档