Форум программистов, компьютерный форум, киберфорум
Наши страницы
Boost C++
Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 19, средняя оценка - 4.74
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
#1

Остановка потока, в котором вызвана синхронная функция ввода вывода - Boost C++

09.01.2013, 22:15. Просмотров 2560. Ответов 23
Метки нет (Все метки)

Имется запущенный поток boost:thread. В нем вызван синхронная операция работы с портом read_some. Все работает хорошо до момента когда захочется этот поток завершить. Сейчас завершаю его мягким способом через join, но он в таком случае конечноже ждеть пока что-нибудь сможет прочитать.
http://www.cyberforum.ru/cpp/thread1791184.html
Как посоветуете поступить с этим делом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.01.2013, 22:15
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Остановка потока, в котором вызвана синхронная функция ввода вывода (Boost C++):

Перегрузка ввода/вывода в/из потока
Никогда потоками не пользовался, поэтому не знаю. Как перегрузить для ввода из...

Перегрузка потока ввода-вывода
Подскажите как правильно перегружать потоки, вот что я делал и какие ошибки...

Закрытие потока ввода/вывода
Здравствуйте! Прошу не ругаться, если вопрос слишком простой и я отнял ваше...

Контроль ввода-вывода потока
Есть функция F которая работает в отдельном потоке и читает данные из stream....

Передача потока ввода/вывода в функцию
Нужно перегрузить оператор ввода и вывода. С перегрузкой проблем не возникало...

23
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
09.01.2013, 22:37 #2
Цитата Сообщение от abutorin Посмотреть сообщение
Как посоветуете поступить с этим делом?
Думаю тут иначе нельзя ведь подвисание вызывает read_some() и внутрь её не залезть ведь так ?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 22:46  [ТС] #3
Технически это возможно (пересобрать boost после своих правок). Но идеалогически невозможно. Неужели нет способа прервать такой поток? Ведь если я не буду вызывать joinа просто попробую закрыть свою программу то она нормально вызовет все деструкторы и прервет все потоки.
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
09.01.2013, 22:48 #4
Блин нифига не понял о чем вы ... при чем тут boost ?

Приведите какой нибудь код....
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 22:56  [ТС] #5
Я использую библиотеку boost::asio для работы с последовательным портом и метод boost::asio::read_some_вызываю в обработчике потока(boost::thread).
Код очень громоздкий, писать синтетический вариант для примера долго. Вопрос простой, кто как поступает если в потоке используются синхронные методы и эти потоки необходимо останавливать.
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
09.01.2013, 23:00 #6
Цитата Сообщение от abutorin Посмотреть сообщение
Я использую библиотеку boost::asio для работы с последовательным портом и метод boost::asio::read_some
Только я чет не понимаю что за порт ? Что с asio можно работать с COM- портом ?

Может речь про сокет ?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 23:08  [ТС] #7
Только через него и может http://www.boost.org/doc/libs/1_52_0/doc/html/boost_asio/overview.html.
Это вообщем-то неважно, с сокетом будут теже проблемы.Тут вопрос больше про синхронныеметоды чтения.

Добавлено через 1 минуту
Цитата Сообщение от Avazart Посмотреть сообщение
COM- портом
Скорее последовательным портом, т.к. в NIX-ах нет com-портов. (програмка пишетля под линукс)
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
09.01.2013, 23:15 #8
Блин я чет туплю...

Реализуйте таймаут ... им и будет определятся время работы после команды завершить...

Добавлено через 4 минуты
http://myworkonly.blogspot.com/2012/04/timeout-serial-on-boost.html
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
09.01.2013, 23:22  [ТС] #9
По статье понял что готового решения нет и нужно делать собственное с использование асинхронного чтения. Если читать асинхронно то и проблемы моей не встанет.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.01.2013, 09:47 #10
abutorin, Эм. А что мешает использовать async_read_*? Или же если так не хочется ждать завершения, detachнуть поток?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 10:15  [ТС] #11
ForEveR, ничем не мешает, просто я думал есть штатная возможность. Как например в случае засыпания потока через boost:sleep его можно прервать штатными средствами без ожидания завершения.
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.01.2013, 10:31 #12
abutorin, Ну так-то можно не join ведь вызывать, а timed join.

C++
1
2
3
4
    template <class Rep, class Period>
    bool try_join_for(const chrono::duration<Rep, Period>& rel_time); // EXTENSION
    template <class Clock, class Duration>
    bool try_join_until(const chrono::time_point<Clock, Duration>& t); // EXTENSION
C++
1
2
3
4
5
#if defined BOOST_THREAD_PROVIDES_DEPRECATED_FEATURES_SINCE_V3_0_0 || defined BOOST_THREAD_DONT_USE_CHRONO
    bool timed_join(const system_time& wait_until);
    template<typename TimeDuration>
    bool timed_join(TimeDuration const& rel_time);
#endif
http://www.boost.org/doc/libs/1_52_0...agement.thread
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 10:53  [ТС] #13
ForEveR, думаю timed_join здесь может подойти. Хотя для надежности асинхронные методы исопльзовать похоже будет корректнее. Как я понимаю timed_join это всеже кардинальный метод завершения потока.
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
10.01.2013, 16:12 #14
Цитата Сообщение от abutorin Посмотреть сообщение
timed_join это всеже кардинальный метод завершения потока.
чЁ ?
0
abutorin
0 / 0 / 0
Регистрация: 09.03.2012
Сообщений: 19
10.01.2013, 16:37  [ТС] #15
Да, несовсем корректно перевел. Не кардинальный способ. Вообщем понял что стоит в данном случае использовать асинхронные методы.
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
10.01.2013, 16:43 #16
Ну так что синхронном режиме разве не предусмотрены таймауты ?

Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
abutorin, Эм. А что мешает использовать async_read_*? Или же если так не хочется ждать завершения, detachнуть поток?
Кстати detach как я понимаю это грубое завершение, типа TerminatedThread() на уровне WinApi ?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.01.2013, 16:58 #17
Avazart, Эм. Нет. TerminateThread судя по описанию просто убивает поток, а detach отпускает поток в свободное плавание.
0
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
10.01.2013, 17:01 #18
Цитата Сообщение от ForEveR Посмотреть сообщение
отпускает поток в свободное плавание
Это как ? Честно говоря не понимаю ... тобиш он продолжает работать и может изменять данные ( ну и память под него занята ) ?
0
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 3
10.01.2013, 17:15 #19
Avazart, Что делает join? Поток вызвавший данную функцию ожидает окончания работы потока на котором вызвана заданная функция. detach же просто отпускает второй поток в свободное плавание, т.е. поток продолжает работать, но к нему больше нет никакого доступа через объект типа boost::thread, однако при завершении главного потока относительно этого потока - умрет. Пример чуть позже приложу.
1
Avazart
Эксперт С++
7674 / 5583 / 541
Регистрация: 10.12.2010
Сообщений: 25,046
Записей в блоге: 17
10.01.2013, 18:06 #20
Цитата Сообщение от ForEveR Посмотреть сообщение
однако при завершении главного потока относительно этого потока - умрет.
Ну так при завершении приложения(основного потока) с "отсоединенным потоком" и будет вызван TerminatedThread так как мягко его уже завершить нельзя.
0
10.01.2013, 18:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.01.2013, 18:06
Привет! Вот еще темы с решениями:

Переключение файлового потока ввода вывода
Есть прога. Если закоментить первый цикл то будет читать из файла, если второй...

Перегрузка потока ввода вывода в dll
Доброго времени суток. Мне нужно создать dll, которая содержит экспортируемый...

Перехват потока вывода и ввода из командной строки
Допустим, у меня работает консольное приложение, которое в какой-то момент...

Чтение байтов из потока файлового ввода-вывода
Никогда не работал в командной строке. Подскажите как с помощью программы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru