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

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

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

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

Остановка рабочей функции потока
День добрый. Задумался над таким вот вопросом. Допустим, у меня есть две...

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

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

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

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

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

23
ForEveR
В астрале
Эксперт С++
7994 / 4753 / 651
Регистрация: 24.06.2010
Сообщений: 10,547
Завершенные тесты: 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
Эксперт С++
7682 / 5591 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 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
1863 / 1481 / 749
Регистрация: 21.12.2010
Сообщений: 2,473
Записей в блоге: 11
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
Эксперт С++
7682 / 5591 / 543
Регистрация: 10.12.2010
Сообщений: 25,073
Записей в блоге: 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
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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