Форум программистов, компьютерный форум, киберфорум
Наши страницы

Boost C++

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

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

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

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

Остановка рабочей функции потока - C++
День добрый. Задумался над таким вот вопросом. Допустим, у меня есть две функции get(StopObj obj) и process(StopObj obj). Эти две функции...

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

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

Закрытие потока ввода/вывода - Java
Здравствуйте! Прошу не ругаться, если вопрос слишком простой и я отнял ваше время( Имеется метод InputString(), который считывает строку с...

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

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

23
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
10.01.2013, 16:43 #16
Ну так что синхронном режиме разве не предусмотрены таймауты ?

Добавлено через 3 минуты
Цитата Сообщение от ForEveR Посмотреть сообщение
abutorin, Эм. А что мешает использовать async_read_*? Или же если так не хочется ждать завершения, detachнуть поток?
Кстати detach как я понимаю это грубое завершение, типа TerminatedThread() на уровне WinApi ?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
10.01.2013, 16:58 #17
Avazart, Эм. Нет. TerminateThread судя по описанию просто убивает поток, а detach отпускает поток в свободное плавание.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
10.01.2013, 17:01 #18
Цитата Сообщение от ForEveR Посмотреть сообщение
отпускает поток в свободное плавание
Это как ? Честно говоря не понимаю ... тобиш он продолжает работать и может изменять данные ( ну и память под него занята ) ?
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
10.01.2013, 17:15 #19
Avazart, Что делает join? Поток вызвавший данную функцию ожидает окончания работы потока на котором вызвана заданная функция. detach же просто отпускает второй поток в свободное плавание, т.е. поток продолжает работать, но к нему больше нет никакого доступа через объект типа boost::thread, однако при завершении главного потока относительно этого потока - умрет. Пример чуть позже приложу.
1
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
10.01.2013, 18:06 #20
Цитата Сообщение от ForEveR Посмотреть сообщение
однако при завершении главного потока относительно этого потока - умрет.
Ну так при завершении приложения(основного потока) с "отсоединенным потоком" и будет вызван TerminatedThread так как мягко его уже завершить нельзя.
0
ForEveR
В астрале
Эксперт С++
7983 / 4742 / 321
Регистрация: 24.06.2010
Сообщений: 10,545
Завершенные тесты: 3
10.01.2013, 18:42 #21
Avazart, Поток будет завершен, верно. Однако если TerminateThread сразу при вызове его прибьет, то detach прибьет когда завершится основной поток исполнения (так то, выполнение потока вполне может завершится раньше окончания основного потока исполнения и все будет окей), так что я бы не сказал что detach эквивалентно TerminateThread.

When the boost::thread object that represents a thread of execution is destroyed the thread becomes detached. Once a thread is detached, it will continue executing until the invocation of the function or callable object supplied on construction has completed, or the program is terminated. A thread can also be detached by explicitly invoking the detach() member function on the boost::thread object. In this case, the boost::thread object ceases to represent the now-detached thread, and instead represents Not-a-Thread.
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
10.01.2013, 20:35 #22
Ну как я понимаю join() и timed_join() аналогичны WaitForSingleObject()
detach() же "стирает" хендл потока хранящийся в объекте потока boost::thread
If *this refers to a thread of execution, that thread of execution becomes detached, and no longer has an
associated boost::thread object
Поэтому join после detach() просто не проканает ( что странное и ошибку не выбьет даже )

Значит после detach() поток в случае завершении программы можно завершится только грубо ?
0
igorrr37
1648 / 1276 / 133
Регистрация: 21.12.2010
Сообщений: 1,932
Записей в блоге: 7
11.01.2013, 19:27 #23
всё же при синхроном чтении есть non-blocking mode
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <clocale>
#define BOOST_THREAD_USE_LIB
#include <boost/thread.hpp>
#include <boost/asio.hpp>
#include <boost/ref.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>
typedef boost::asio::ip::tcp btcp;
 
void F(btcp::socket& tcpsocket)
{
    char buffer[5];
    size_t read;
    boost::system::error_code errorcode;
    while(true)
    {
        read = tcpsocket.read_some(boost::asio::buffer(buffer, sizeof(buffer)), errorcode);
        if(read)
        {
            std::cout.write(buffer, read);
        }
        boost::this_thread::interruption_point();
    }
}
 
int main()
{
    setlocale(LC_ALL, "rus");
    try
    {
        boost::asio::io_service ioservice;
        boost::system::error_code errorcode;
        btcp::socket tcpsocket(ioservice);
        tcpsocket.connect(btcp::endpoint(boost::asio::ip::address::from_string("127.0.0.1"), 9090));
        tcpsocket.non_blocking(true);
        boost::thread th(F, boost::ref(tcpsocket));
        boost::this_thread::sleep(boost::posix_time::seconds(5));
        th.interrupt();
        th.join();
        if(tcpsocket.shutdown(btcp::socket::shutdown_both, errorcode))
            std::cerr << "shutdown in main failed" << std::endl;
        tcpsocket.close();
    }
    catch(std::exception const& e)
    {
        std::cerr << "Exception in main: " << e.what() << std::endl;
    }
    return 0;
}
0
Avazart
Эксперт С++
7247 / 5419 / 297
Регистрация: 10.12.2010
Сообщений: 24,048
Записей в блоге: 17
11.01.2013, 19:35 #24
Цитата Сообщение от igorrr37 Посмотреть сообщение
всё же при синхроном чтении есть non-blocking mode
Как то странно звучит...
0
11.01.2013, 19:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
11.01.2013, 19:35
Привет! Вот еще темы с ответами:

Передача потока ввода/вывода в функцию - C++ Builder
Нужно перегрузить оператор ввода и вывода. С перегрузкой проблем не возникало до этого момента. Есть класс. #include &lt;iostream&gt; ...

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

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

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


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

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

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