Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: akaMDA от Август 07, 2012, 10:32



Название: Обмен данными между потоками
Отправлено: akaMDA от Август 07, 2012, 10:32
Имеется н не сколько потоков,  обменивающихся данными через сигналы слоты. Работает все нормально,  но через какое то время соответствии перестают отвечать на сигналы.  В чем может быть проблема?


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 10:51
Возможно где то сигналы бегают к слотам, но через какое то они накрывают поляну с водочкой и пивасиком и перестают бегать. Их мобильность падает на 98%, а те, кто всё таки доходит до слотов, не могут передать ни одного вразумительного параметра трезвому и злому слоту.

PS телепаты в отпуске, маразматиков нету, телепортов тоже пока не придумали.


Название: Re: Обмен данными между потоками
Отправлено: DmitryM от Август 07, 2012, 11:59
Имеется н не сколько потоков,  обменивающихся данными через сигналы слоты. Работает все нормально,  но через какое то время соответствии перестают отвечать на сигналы.  В чем может быть проблема?
Запусти анализатор потоков и посмотри кто заблокирован.


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 12:00
А можно и мне ссылочку на анализатор потоков?


Название: Re: Обмен данными между потоками
Отправлено: DmitryM от Август 07, 2012, 12:42
А можно и мне ссылочку на анализатор потоков?
Хотя бы Intel Thread Profiler (http://software.intel.com/ru-ru/articles/using-intel-thread-profiler-for-win32-threads-philosophy-and-theory/)


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 13:12
Хм. А не проще тупо лог вести в файл? :) Профайлер на то и профайлер, что он анализирует быстродействие.


Название: Re: Обмен данными между потоками
Отправлено: DmitryM от Август 07, 2012, 13:55
Хм. А не проще тупо лог вести в файл? :) Профайлер на то и профайлер, что он анализирует быстродействие.
Ввод/вывод неявно синхронизирует потоки.
Заблуждаешься, профайлер нужен для сбора данных о работающей программе.
В данном случае, если потоки не заблокированы, то ошибка в алгоритме и обработке очереди сообщений.


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 14:24
Кхм. Вопрос, а как ввод/вывод неявно синхронизирует потоки? Пожалуйста подробнее.


Название: Re: Обмен данными между потоками
Отправлено: DmitryM от Август 07, 2012, 15:06
Кхм. Вопрос, а как ввод/вывод неявно синхронизирует потоки? Пожалуйста подробнее.
system call


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 15:10
И? Поясните мне пожалуйста, как 2 рассинхронизированных потока смогут синхронизироваться при записи в 2 разных файла?

PS мб вы имели в виду, что имеется шанс в 20%, что потоки на некий момент времени могут синхронизироваться и шанс в 80% что они могут рассинхронизироваться при этом?

PPS или вы мб знаете больше чем я об асинхронных системных вызовах и о том, что они асинхронные?


Название: Re: Обмен данными между потоками
Отправлено: DmitryM от Август 07, 2012, 15:28
PPS или вы мб знаете больше чем я об асинхронных системных вызовах и о том, что они асинхронные?
Внутри std::cerr, std::cout, лежит системный вызов write.


Название: Re: Обмен данными между потоками
Отправлено: Igors от Август 07, 2012, 15:33
Имеется н не сколько потоков,  обменивающихся данными через сигналы слоты. Работает все нормально,  но через какое то время соответствии перестают отвечать на сигналы.  В чем может быть проблема?
Ну свалить в консоль испускаемые сигналы и таким образом убедиться что они были испущены, но не дошли до цели. Просто тормознуться когда висит и посмотреть чем занята каждая нитка. Мало информации чтобы что-то рекомендовать конкретно


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 15:50
Эмм.. я как бы говорю о системных вызовах асинхронной записи в файл, а вы? :D

PS а по теме - достаточно дебагера, чтобы узнать где что завяло.


Название: Re: Обмен данными между потоками
Отправлено: DmitryM от Август 07, 2012, 16:06
Эмм.. я как бы говорю о системных вызовах асинхронной записи в файл, а вы? :D
Вызов системной функции не атомарная операция?
В случае, если два потока захотят выполнить одновременно системную функцию, один из потоков не заблокируется на время выполнения системного вызова?


Название: Re: Обмен данными между потоками
Отправлено: Igors от Август 07, 2012, 16:32
Эмм.. я как бы говорю о системных вызовах асинхронной записи в файл, а вы? :D
Неясно откуда/причем здесь async  :)  Какое-то выравнивание на I/O есть, даже если пишут в разнве файлы (устройство-то одно). Однако этот эффект может быть очень всяким (иногда и нулевым). Не думаю что правильно называть это "синхронизацией".  

Вызов системной функции не атомарная операция?
Нет, не атомарная (не lock-free)
В случае, если два потока захотят выполнить одновременно системную функцию, один из потоков не заблокируется на время выполнения системного вызова?
Может и нет (с печальными последствиями). Для таких вызовов в доке и хедерах указано "not thread-safe"


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 17:31
async здесь потому, что потоки то рассинхронизированы. Точнее я неудачно выразился - async относилось к вызовам в потоках, а к записи отношения не имеет :)

И если по умолчанию, то запись в файл кешируется. И соответственно *блокирование вызовов не произойдёт. :)

А если и произойдёт, то одномоментная синхронизация ничего не даст. Вообще. Ибо в следующий момент будет рассинхронизация. Любой поток в системе может вот так случайно синхронизироваться :D
Было у меня пару раз явление под названием гонка потоков :D И представь, программа целую неделю работала и потоки были синхронизированы. Ан нет, потом что-то внесло изменения в их устоявшееся сообщество и они рассинхронизировались => крах программы.

И да - с чего начался спор то - ничего вывод не синхронизирует :D А если и есть влияние то оно не выходит за обычные рамки вероятности.



Название: Re: Обмен данными между потоками
Отправлено: Igors от Август 07, 2012, 18:48
А если и произойдёт, то одномоментная синхронизация ничего не даст. Вообще. Ибо в следующий момент будет рассинхронизация. Любой поток в системе может вот так случайно синхронизироваться :D
Было у меня пару раз явление под названием гонка потоков :D И представь, программа целую неделю работала и потоки были синхронизированы. Ан нет, потом что-то внесло изменения в их устоявшееся сообщество и они рассинхронизировались => крах программы.
Это мне что-то напоминает
Цитировать
А вот на этом поле, веришь, сам зайца за задние ноги поймал!
..
Все до того леса мое, и тот лес тоже мой
:) :)


Название: Re: Обмен данными между потоками
Отправлено: DmitryM от Август 07, 2012, 19:46
И да - с чего начался спор то - ничего вывод не синхронизирует :D А если и есть влияние то оно не выходит за обычные рамки вероятности.
Я говорил, что происходит скрытая синхронизация, т .к. системные вызовы работающие с I/O производят блокировку.
Если множество потоков будет делал частые системные вызовы, то потоки будут влиять друг на друга.


Название: Re: Обмен данными между потоками
Отправлено: Bepec от Август 07, 2012, 19:49
Igors - приведи своё мнение ) Я с удовольствием почитаю :)

Дмитрий я тебе по секрету скажу - система вызывает потоки согласно свободным ресурсам и приоритетам. Так что синхронизация происходит на уровне уже самой системы :D

PS ну сам подумай головой - всё в ОС контролируется системными вызовами. Qt же является лишь надстройкой :D