Да-да-да, а если случится data race?
Нет уж, перед смертью один должен брать блокировку на смерть и держать ее до тех пор, пока второй не выберет новое доверенное лицо.
Перечитал ваше сообщение еще раз и не согласен в одном моменте:
>> тут возникает такой инструмент как wait(), который позволяет сказать системному планировщику задач, что вот ближайшие сколько-то времени этому потоку процессор не нужен.
wait бывает же без времени, бесконечный по событию.
Допустим я могу реализовать алгоритм, когда беру мютекс, проверяю, что некое абстрактное событие еще не произошло выставляю флажок — разбудите меня, когда закончите. И поток засыпает в пределе навечно, пока не разбудят. И вот тут использование while для непосвященного кажется совсем избыточным.
Решал классическим русским способом — авось не случится :-)
А на самом деле, мне кажется это вообще некорректной проблемой в продакшн коде.
Далеко не только pthreads используют условно говоря функцию time() и везде это решать — того не стоит.
Проще обязать админов переводить время через ускорение/замедление часов в ntp и резкие скачки времени объявить UB в лучших традициях C++.
Хотя, для коробочных продуктов для домашних пользователей проблема стоит, конечно, более остро. Но это пока не моя сфера.
Ну что значит не причина.
Тут как с любым другим UB (а вероятно это объявлено как UB в Стандарте) — если оно не проявляется, это не значит, что этот код не проблемный. Стандарт еще не глядел, но на cppreference требуется, чтобы или использовать внешний цикл вручную или дать лямбду, а Стандартная библиотека сделает все за тебя внутри.
Я неправильно выразился — проблем у меня не было, у меня было непонимание зачем while нужен и желание заменить его на if.
>> Вот только исходный busy-loop от этого никуда не девается — просто внутрь него добавляется этот самый wait. То есть это не wait оборачивается в цикл — это цикл дополняется wait-ом.
Ну вот в Джаве же не так? Я не очень хорошо ее знаю, особенно многопоточность, но там никаких аргументов у wait нет, а коллега Джавист воспринял эти ложные просыпания как очередную красноглазую дикость :-) Вероятно, там этой проблемы нет.
Это к вопросу о том, что в теории для wait-а не требуется цикл, а добавлять его приходится из чисто практических соображений (особенности ядра). Скажем так, в псевдокоде он бы не потребовался.
Пользуясь случаем хочу порекомендовать всем с/c++, использующим pthreads и c++11 погуглить на тему «Spurious wakeup», чтобы четко понимать, зачем всегда нужно оборачивать wait в while.
Это известная проблема pthreads, уходящая корнями в проблемы ядра, которая перекочевала в C++11 как важное примечание и особенно интерфейса метода std::condition_variable::wait с двумя параметрами.
Буквально на днях нарвался очень неприятно.
Турбофильм + вконтакте несколько раз (хотя сейчас плачу их Яндекс.Деньгами и вообще появилась бесплатная возможность получить рекламные «голоса») — «подарки» сестре дарил.
Возможность просто нажать «play» на любом устройстве мгновенно.
Стриминг торрентов хоть ты тресни работает средненько и только на компьютере.
Ну и приятное наличие всегда субтитров и перевода в день выхода — но рутрекер этим особо не удивить.
А это и не открытые лекции.
Это закрытые лекции кафедры ИУ-9, на которые была «пиратски» (хотя и с разрешения автора) принесена камера :-)
Самоцелью это не является на данный момент.
Извините пожалуйста, что у главного координатора проекта reactos (http://reactos.org/contact) непоставленный голос — при этом это кстати придирка — замечательно слушается все.
Нет уж, перед смертью один должен брать блокировку на смерть и держать ее до тех пор, пока второй не выберет новое доверенное лицо.
Дальше все само пойдет.
Уже середина апреля, семестр до конца мая, а там еще и майские…
>> тут возникает такой инструмент как wait(), который позволяет сказать системному планировщику задач, что вот ближайшие сколько-то времени этому потоку процессор не нужен.
wait бывает же без времени, бесконечный по событию.
Допустим я могу реализовать алгоритм, когда беру мютекс, проверяю, что некое абстрактное событие еще не произошло выставляю флажок — разбудите меня, когда закончите. И поток засыпает в пределе навечно, пока не разбудят. И вот тут использование while для непосвященного кажется совсем избыточным.
А на самом деле, мне кажется это вообще некорректной проблемой в продакшн коде.
Далеко не только pthreads используют условно говоря функцию time() и везде это решать — того не стоит.
Проще обязать админов переводить время через ускорение/замедление часов в ntp и резкие скачки времени объявить UB в лучших традициях C++.
Хотя, для коробочных продуктов для домашних пользователей проблема стоит, конечно, более остро. Но это пока не моя сфера.
Тут как с любым другим UB (а вероятно это объявлено как UB в Стандарте) — если оно не проявляется, это не значит, что этот код не проблемный. Стандарт еще не глядел, но на cppreference требуется, чтобы или использовать внешний цикл вручную или дать лямбду, а Стандартная библиотека сделает все за тебя внутри.
Я неправильно выразился — проблем у меня не было, у меня было непонимание зачем while нужен и желание заменить его на if.
>> Вот только исходный busy-loop от этого никуда не девается — просто внутрь него добавляется этот самый wait. То есть это не wait оборачивается в цикл — это цикл дополняется wait-ом.
Ну вот в Джаве же не так? Я не очень хорошо ее знаю, особенно многопоточность, но там никаких аргументов у wait нет, а коллега Джавист воспринял эти ложные просыпания как очередную красноглазую дикость :-) Вероятно, там этой проблемы нет.
Это к вопросу о том, что в теории для wait-а не требуется цикл, а добавлять его приходится из чисто практических соображений (особенности ядра). Скажем так, в псевдокоде он бы не потребовался.
Это известная проблема pthreads, уходящая корнями в проблемы ядра, которая перекочевала в C++11 как важное примечание и особенно интерфейса метода std::condition_variable::wait с двумя параметрами.
Буквально на днях нарвался очень неприятно.
Стриминг торрентов хоть ты тресни работает средненько и только на компьютере.
Ну и приятное наличие всегда субтитров и перевода в день выхода — но рутрекер этим особо не удивить.
Это закрытые лекции кафедры ИУ-9, на которые была «пиратски» (хотя и с разрешения автора) принесена камера :-)
Самоцелью это не является на данный момент.
Если точно придешь — могу и на тебя попросить.