Russian Qt Forum
Апрель 20, 2024, 11:02 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Корректен ли пример ?  (Прочитано 4565 раз)
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« : Август 25, 2018, 06:00 »

Добрый день

Ссылка 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();
выполняются при НЕ захваченном мутексе? Разве так (уже) можно?

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

Спасибо
Записан
RedDog
Частый гость
***
Offline Offline

Сообщений: 221


Просмотр профиля
« Ответ #1 : Август 25, 2018, 08:13 »

Пишет в булеву один поток и эта операция вроде как атомарна для булевых переменных. Можно так делать.
Слип ну просто так воткнули.
Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3258


Просмотр профиля
« Ответ #2 : Август 25, 2018, 11:39 »

Не корректен.
Нельзя писать в бул без мютекса. Нельзя звать ноттфай без мьютекса.
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #3 : Август 25, 2018, 11:42 »

Не корректен.
Нельзя писать в бул без мютекса. Нельзя звать ноттфай без мьютекса.
Да и судя по примеру его писал какой-то школьник. Улыбающийся
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #4 : Август 25, 2018, 12:34 »

Не корректен.
Нельзя писать в бул без мютекса. Нельзя звать ноттфай без мьютекса.
Да как же так Непонимающий Там ведь писали знатоки std - это ж вышак!

Плюху покажите, а то "льзя/нельзя" не убежждает
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4349



Просмотр профиля
« Ответ #5 : Август 25, 2018, 12:37 »

Да как же так Непонимающий Там ведь писали знатоки std - это ж вышак!
Вы думаете, что в интернетах пишут только знатоки std? Улыбающийся
Записан
zhbr
Гость
« Ответ #6 : Август 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 вот тут подробнее рассказано.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 22.