mutex c++ как приостановить поток?
Только не четные потоки должны увеличить переменную на 1. Помогите с кодом, почему-то крашится программа на 2-3ей итерации. Возможно это написать только с помощью мьютексов?
#include <Windows.h>
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>
using namespace std;
mutex m;
class A
{
int x;
public:
A(int x) :x(x) {};
void print(int i)
{
if (i % 2 == 0) m.unlock();
Sleep(500);
cout << "thread #" << i << ": " << x << endl;
if (m.try_lock()) x++;
}
void start()
{
vector <thread> t;
for (int i = 0; i < 10; i++)
{
m.lock();
t.push_back(thread(&A::print, this, i));
t[i].join();
}
}
};
int main()
{
A a(1);
a.start();
}
Ответы (1 шт):
Автор решения: Harry
→ Ссылка
Тогда уж типа
void print(int i)
{
Sleep(500);
if (i % 2)
{
m.lock();
x++;
m.unlock();
}
m.lock();
cout << "thread #" << i << ": " << x << endl;
m.unlock();
}
Или еще лучше :)
void print(int i)
{
Sleep(500);
m.lock();
if (i % 2)
{
x++;
}
cout << "thread #" << i << ": " << x << endl;
m.unlock();
}
Только у вас все равно реальной многопоточности нет - вы ее этим join зарезаете... Чисто чтоб посмотреть на многопоточность - сделайте
void start()
{
vector <thread> t;
for (int i = 0; i < 10; i++)
{
t.push_back(thread(&A::print, this, i));
t[i].detach();
}
Sleep(1000);
}