condition_variable почему не залочился в unique_lock?

116
13 октября 2021, 17:20

Есть такой пример использования condition_variable:

std::mutex m;
std::condition_variable v;
bool b;
void thfunc() {
    std::this_thread::sleep_for(std::chrono::milliseconds(100));
    cout << "signal st" << endl;
    {
        std::unique_lock<std::mutex> locker(m);
        b = false;
        v.notify_one();
    }
}
void Run() {
    b = true;
    std::thread th(thfunc);
    th.detach();
    //std::this_thread::sleep_for(std::chrono::milliseconds(100));
    {
        std::unique_lock<std::mutex> ulock(m);
        while (b)
            v.wait(ulock);
    }
    cout << "signal recv" << endl;
    cout << "signal recv" << endl;
}

1) Если поставить guard_lock он не компилится. Зачем вариабле лок? notify_one() живёт же без лока.

2) Если обернуть m.lock() сверху то вроде работает. Но может мне повезло?

3) Поток ожидания должен был вызвать лок при создании ulock и не дать зайти к v.notify_one(); и остановить его навечно. Но пример работает.

4) Для того, чтобы этот пример работал нужно 4 переменных m, v, b, ulock почему std не объединило их в одну?

Соответственно почему же выходят такие результаты?

Сделать пытаюсь простую вещь: поток 1 засыпает и ждёт пока поток 2 его не просигналит проснутся. Сигнал проснуться может быть послан как до того как поток уснул, так и после/во время. Может для этого есть особый вариант в std?

READ ALSO
Вычисление одинаковых цифр числа. Код есть, он работает. Но вылетает при использовании больших чисел

Вычисление одинаковых цифр числа. Код есть, он работает. Но вылетает при использовании больших чисел

Учу С++ самостоятельно, вот решил написать программу, которая определяет, есть ли повторяющиеся цифры в числеЧтобы усложнить себе жизнь, добавил...

367
c++ push_back правильно ли написал?

c++ push_back правильно ли написал?

у меня все работает хорошо, но в arr[0] где то присваивается 0Поэтому я пишу в PrintArray int i = 1

264
перегрузка operator+ c++

перегрузка operator+ c++

я написал перегрузку оператора+ для класса Dinamic:

203