Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: Igors от Август 25, 2018, 06:00



Название: Корректен ли пример ?
Отправлено: Igors от Август 25, 2018, 06:00
Добрый день

Ссылка https://ru.cppreference.com/w/cpp/thread/condition_variable (https://ru.cppreference.com/w/cpp/thread/condition_variable), для удобства вот текст примера
Код:
#include <condition_variable>
#include <mutex>
#include <thread>
#include <iostream>
#include <queue>
#include <chrono>
 
int main()
{
    std::queue<int> produced_nums;
    std::mutex m;
    std::condition_variable cond_var;
    bool done = false;
    bool notified = false;
 
    std::thread producer([&]() {
        for (int i = 0; i < 5; ++i) {
            std::this_thread::sleep_for(std::chrono::seconds(1));
            std::unique_lock<std::mutex> lock(m);
            std::cout << "producing " << i << '\n';
            produced_nums.push(i);
            notified = true;
            cond_var.notify_one();
        }
 
        done = true;
        cond_var.notify_one();
    });
 
    std::thread consumer([&]() {
        std::unique_lock<std::mutex> lock(m);
        while (!done) {
            while (!notified) {  // loop to avoid spurious wakeups
                cond_var.wait(lock);
            }
            while (!produced_nums.empty()) {
                std::cout << "consuming " << produced_nums.front() << '\n';
                produced_nums.pop();
            }
            notified = false;
        }
    });
 
    producer.join();
    consumer.join();
}
Почему эти строки
Цитировать
        done = true;
        cond_var.notify_one();
выполняются при НЕ захваченном мутексе? Разве так (уже) можно?

И заодно: что там за секундная задержка такая? Что изменится если ее убрать?

Спасибо


Название: Re: Корректен ли пример ?
Отправлено: RedDog от Август 25, 2018, 08:13
Пишет в булеву один поток и эта операция вроде как атомарна для булевых переменных. Можно так делать.
Слип ну просто так воткнули.


Название: Re: Корректен ли пример ?
Отправлено: Авварон от Август 25, 2018, 11:39
Не корректен.
Нельзя писать в бул без мютекса. Нельзя звать ноттфай без мьютекса.


Название: Re: Корректен ли пример ?
Отправлено: Old от Август 25, 2018, 11:42
Не корректен.
Нельзя писать в бул без мютекса. Нельзя звать ноттфай без мьютекса.
Да и судя по примеру его писал какой-то школьник. :)


Название: Re: Корректен ли пример ?
Отправлено: Igors от Август 25, 2018, 12:34
Не корректен.
Нельзя писать в бул без мютекса. Нельзя звать ноттфай без мьютекса.
Да как же так ??? Там ведь писали знатоки std - это ж вышак!

Плюху покажите, а то "льзя/нельзя" не убежждает


Название: Re: Корректен ли пример ?
Отправлено: Old от Август 25, 2018, 12:37
Да как же так ??? Там ведь писали знатоки std - это ж вышак!
Вы думаете, что в интернетах пишут только знатоки std? :)


Название: Re: Корректен ли пример ?
Отправлено: zhbr от Август 26, 2018, 06:33
Плюху покажите, а то "льзя/нельзя" не убежждает

если бы bool как есть был атомарен, не было бы std::atomic_bool. https://stackoverflow.com/questions/16320838/when-do-i-really-need-to-use-atomicbool-instead-of-bool/16321311 (https://stackoverflow.com/questions/16320838/when-do-i-really-need-to-use-atomicbool-instead-of-bool/16321311) вот тут подробнее рассказано.