Я пытаюсь защитить часть кода с помощью мьютекса. Из-за сбоя кода ниже я создал простой тестовый код, который делает то же самое. Сбой не обязательно происходит в одной и той же строке кода каждый раз, но всегда происходит вокруг вызовов «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 :: поток деструктор документы:
Уничтожает объект потока. Если * это все еще имеет связанный запущенный поток (т.е. joinable () == true), вызывается std :: terminate ().
Других решений пока нет …