2013-12-13 2 views
0

Я пытаюсь защитить раздел кода с помощью мьютекса. Из-за сбоя кода я создал простой бит тестового кода ниже, который делает то же самое. Авария всегда не обязательно в одной строке кода, но всегда вокруг вызовов «WaitForSingleObject» или «Sleep».WaitForSingleObject Crash

Любая помощь будет оценена по достоинству.

#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().

Смежные вопросы