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);
}
→ Ссылка