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

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

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

Сообщений: 11445


Просмотр профиля
« Ответ #15 : Декабрь 15, 2012, 13:10 »

Нужно юзать QWaitCondition.
Ну так код предъявляем  Улыбающийся

А с атомиками можно придумать что-то типа такого:
Если ожидание ввода от пользователя (или вообще ожидание может быть долгим) то жечь процессор не есть хорошо, atomic не к месту. А реализация не рабочая
Код
C++ (Qt)
buffer.fetchAndStoreOrdered(tmp);
// нитка 1 сейчас здесь, записала в buffer новое значение
 
...
// нитка 2 активировалась и перетирает записанное
  buffer.fetchAndStoreOrdered(-257);
}
Ну ничего, на такие грабли наступают все - и очень много раз  Улыбающийся
Записан
Dancing_on_water
Гость
« Ответ #16 : Декабрь 15, 2012, 14:26 »

Цитировать
Ну так код предъявляем
http://doc.qt.digia.com/qt/qwaitcondition.html

Цитировать
Если ожидание ввода от пользователя (или вообще ожидание может быть долгим) то жечь процессор не есть хорошо, atomic не к месту.
Вы придумали абстрактный пример и ввели искусственные ограничения, а теперь говорите о уместности\неуместности. Да блинский блин, одно уже переключение шедулера тут неуместно!

Цитировать
А реализация не рабочая
Я рад, что вы заметили. Но я сказал:
Цитировать
А с атомиками можно придумать что-то типа такого
. Я не придрался, но раз хотите, то и вами предложенный вариант может работать некорректно: может так случиться, что мы пойдем на чтение раньше, чем начнем выводить.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #17 : Декабрь 15, 2012, 15:17 »

Ну и чего тыкать в нос ссылкой на букварь? Улыбающийся Вас спрашивали как это применить, класс-то все знают. Кстати заметили ли Вы что приводимый там пример некорректен?

Вы придумали абстрактный пример и ввели искусственные ограничения, а теперь говорите о уместности\неуместности. Да блинский блин, одно уже переключение шедулера тут неуместно!
Не злитесь, задачка самая рядовая и в жизни встречается частенько. Я понимаю что atomic - это реально трудно. Хотите я напишу а Вы будете искать ошибку?  Улыбающийся
Записан
Dancing_on_water
Гость
« Ответ #18 : Декабрь 16, 2012, 13:47 »

Цитировать
Ну и чего тыкать в нос ссылкой на букварь?  Вас спрашивали как это применить, класс-то все знают. Кстати заметили ли Вы что приводимый там пример некорректен?
Эээээ, если честно, из описания класса понятно как его применить в подобной ситуации. Пример там приведен описательный, для понимания сути, а не для того, чтобы копипастить.

Цитировать
Не злитесь, задачка самая рядовая и в жизни встречается частенько. Я понимаю что atomic - это реально трудно. Хотите я напишу а Вы будете искать ошибку?
Злиться не умею. Просто свято верю в то, что у человека голова на плечах есть, и если ему подсказать, то он сам додумает до правильного решения. Атомики это не сложнее чем любой другой многопоточный код. Просто у них своя специфика. А приведенный пример вами, в реальной жизни я не встречал ни разу. Чтение данных в одном потоке, а работа с ними в другом - сплошь и рядом.  Но покажите мне того идиота, кто обработку одного char-а запихнет в иной поток, я ему пришью руки на место.

Возвращаясь к корректности моей и вашей синхронизации, то они совершенно корректны Все наши придирки из серии: "а что, если мы получим символ раньше чем его выведем на экран?". Так вот максимальная скорость набора: 400 символов в минуту, т.е. не лучше 1 символа в 100 мс, квант времени ~10 мс, это значит, что за это время шедулер точно успеет выйти из потока-приемника, а вероятность не попадания в поток-обработчик возникнет только при высокой нагрузке. Однако, при высокой нагрузке возникнет вероятность и пропуска сигналы с клавиатуры уже системой.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #19 : Декабрь 16, 2012, 16:01 »

Эээээ, если честно, из описания класса понятно как его применить в подобной ситуации.
Ну если Вам понятно, то и приведите код, в чем загвоздка?  Улыбающийся

Атомики это не сложнее чем любой другой многопоточный код.
Я не хочу Вас обидеть, но согласитесь - пока общие слова, а рабочего кода нет. И предчувствие что Ваш следующий ответ опять будет только из общих слов. Или я не прав? Предложили atomic'и (не знаю зачем) - покажите на деле, а не так, "с пятого на десятое", мол, можно и atomic'и - что можно, то всем известно.

А приведенный пример вами, в реальной жизни я не встречал ни разу. Чтение данных в одном потоке, а работа с ними в другом - сплошь и рядом. 
Так вот именно. Разумеется в реальной задаче будут совсем не getchar и не printf - но суть та же самая. Поэтому ни к чему вдаваться в анализ скорости клавы - программист может и должен уметь думать более широко, абстрактно (там где надо)
Записан
Dancing_on_water
Гость
« Ответ #20 : Декабрь 17, 2012, 09:09 »

Цитировать
Ну если Вам понятно, то и приведите код, в чем загвоздка?
Честно, говоря то все больше напоминает троллинг (правда уже тоньше. Если из доки сне следует что-то подобное, то я в шоке.  Непонимающий

Код:
//глобально 
QWaitСondition waitCondition;

//поток 1
getchar();
waitcondition.wakeAll();

//поток 2
QMutex mutex;
mutex.lock();
waitcondition.wait(&mutex);
mutex.unlock();
fprintf();

Цитировать
Так вот именно. Разумеется в реальной задаче будут совсем не getchar и не printf - но суть та же самая. Поэтому ни к чему вдаваться в анализ скорости клавы - программист может и должен уметь думать более широко, абстрактно (там где надо)
Прежде всего программист должен решить задачу. Для этого он может думать абстрактно. Но если вы абстрактно попытаетесь решить задачу синхронизацию потоков результат будет очень печальным. К примеру, в системе реального времени из-за параноильной синхронизации может спокойно вылетить за допустимый тайминг.
Записан
Igors
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 11445


Просмотр профиля
« Ответ #21 : Декабрь 17, 2012, 17:13 »

Если из доки сне следует что-то подобное, то я в шоке.  Непонимающий

Код:
//глобально 
QWaitСondition waitCondition;

//поток 1
getchar();
waitcondition.wakeAll();

//поток 2
QMutex mutex;
mutex.lock();
waitcondition.wait(&mutex);
mutex.unlock();
fprintf();
a) Батенька, а куда же делся тот char который Вы считали getchar? Почему он не напечатан?
b) Перед wakеAll надо захватывать mutex, а после - освобождать (ну ладно, то Вы описАлись)
с) Даже с учетом сказанного - все равно неправильно, число печатей может быть меньше числа считываний.
d) Что значит "что-то подобное"? Это рабочий код или как? Если нет, то зачем его приводить?

Честно, говоря то все больше напоминает троллинг
Я вижу весьма самонадеянного (вероятно молодого) человека, который довольно резво/категорично обо всем судит. И я предложил ему показать свои умения на очень простой задачке
одна нитка ждет символ с клавиатуры (напр getchar), а другая этот символ печатает (напр printf)
Молодой человек долго извивался, но сделать это ни на одном из примитивов синхронизации так и не смог. Поэтому о "троллинге" ему бы лучше помолчать. И заявления чего там программист должен не очень-то вяжутся с беспомощным плаванием в десятке строк кода.
Записан
Dancing_on_water
Гость
« Ответ #22 : Декабрь 17, 2012, 19:30 »

Цитировать
Молодой человек долго извивался, но сделать это ни на одном из примитивов синхронизации так и не смог. Поэтому о "троллинге" ему бы лучше помолчать. И заявления чего там программист должен не очень-то вяжутся с беспомощным плаванием в десятке строк кода.
Я-то, по наивности думал, что тут нужно топикстартеру помочь, или облегчить жизнь другим, кто будет читать эту тему. Что тут можно поделиться своим скудным опытом, самому узнать что-то новое. Но, попал на ярмарку тщеславия. Хотя не скажу что внезапно, ход беседы к тому и вел.

Ладно, тут уже более не добиться конструктива. И хотя первая часть вашего комментария вводит в заблуждение, но я надеюсь что ищущий человек пройдет по ссылке в доку и не допустит ошибки.

P.S. Перечитал тред. Вы такой забавный.  Смеющийся
Записан
Bepec
Гость
« Ответ #23 : Декабрь 17, 2012, 20:27 »

Кхм. Dancing_on_water - рабочий проект в студию.

Я лично когда разбирался с QWaitCondition скурил выпил весь запас китайского чая (300 граммов). И то до сих пор не понимаю, каким чудом там все работает Веселый
Записан
Dancing_on_water
Гость
« Ответ #24 : Декабрь 17, 2012, 21:34 »

Ну блин, а копнуть исходник qt слабо? Что касается принципиальной схемы реализации, то для винды там стоит WaitForSingleObject.

Логику зачем обязали перед вызовом захватывать mutex  я понимаю с трудом (считай есть только догадки)

Насчет юзанью: выше я привел схему. Она у меня вполне работает при иницилизации приложения.

т.е. строго по доке:

поток 1:

захват мутекса
wait
отпускаем мьютекс

поток 2:

wake
Записан
Bepec
Гость
« Ответ #25 : Декабрь 17, 2012, 21:46 »

Т.е. вы швыряетесь громкими словами об использовании QWaitCondition, а сами не в силах освоить тег code на форуме? Показает язык
Записан
Dancing_on_water
Гость
« Ответ #26 : Декабрь 17, 2012, 22:01 »

Тегом я пользоваться умею. Если соизволите пролистать вверх, то все сами увидите, господин.
Просто то, что я счас написал на код уж совсем не подходит.

Кстати, замечу, в Вашем посте ни слова по теме.
Записан
Bepec
Гость
« Ответ #27 : Декабрь 18, 2012, 08:05 »

А что толку бодаться с вами? Улыбающийся Если уж Igors вас не перебодал, мне чего стараться?
Записан
Страниц: 1 [2]   Вверх
  Печать  
 
Перейти в:  


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