Название: Обмен данными между потоками Отправлено: 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 |