Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
 Аватар для Воротислав
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451

Pimpl + std::thread + linux sockets?

27.03.2017, 09:35. Показов 1244. Ответов 4

Студворк — интернет-сервис помощи студентам
Доброго времени суток.
Есть задача постоянно слушать сокеты, ну и что-то с этим всем делать, класс назван Transport.
Т.к. типы сокетов бывают разные + в конечном классе совсем не надо показывать внутренности - сделал через pimpl.
Теперь дальше, в основной программе крутится вечный цикл, и в начале каждой итерации происходит обращение к моему классу, там вызывается epoll_wait.
Хочу сделать следующее, чтобы в основной программе не вызывать постоянно функцию Transport, вынести последний в отдельный поток со своими вечным циклом. И добавить 2 очереди, одна на прием, вторая на отправку. И они должны быть обе видны из основной программы, т.е. в начале итерации цикла, программа смотрит что есть в очереди на прием, вычитывает(вынимает) сообщения, дальше в цикле где то записывает информацию в очередь на отправку. Transport в свою очередь в вечном цикле опрашивает епол, если что-то вычитал, записывает в очередь на прием и постоянно просматривает очередь на отправку, если не пустая - отправляем. Вопрос в следующем, с потоками на c++11 не работал, есть опыт только с Qt-потоками, поэтому прошу вашей помощи. Лучше весь класс запихать в поток, если только его вечный цикл? Если только цикл, как будет выглядить доступ из потока до очередей? Если весь класс, то метода положить в очередь, и получить из очереди обворачивать в мьютексы?
Ну и, как я понял, при создании потока, надо сразу сделать detach?
Заранее благодарен.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
27.03.2017, 09:35
Ответы с готовыми решениями:

Std::thread::sleep_for(3s)
Всем доброго времени суток. Столкнулся с такой проблемой, что не могу понять как оформить передачу временной задержки на метод...

Чтение переменной несколькими std::thread
Собственно, вопрос в заголовке темы. Можно ли прочитать одну переменную несколькими потоками одновременно? Именно прочесть, а не...

Ошибка "неопределенная ссылка" при работе с std::thread
При попытке сделать что-либо с std::thread, выдает ошибку компиляции, "неопределенная ссылка " . К примеру: #include...

4
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
27.03.2017, 11:06
я бы реализовал при помощи тред-пула.

в пул добавляется задача:
ожидать сообщения, и вычитывать их.
он спит, пока не придут новые сообщения.
задача инициализируется коллбеком,
который нужно дернуть,
что бы уведомить о полученной посылке.


другой тред спит до тех пор, пока ему не закинули задачу:
отправить в сокет новое сообщение.
он закидывает. и если новых задач не накидали - засыпает.

Цитата Сообщение от Воротислав Посмотреть сообщение
обворачивать в мьютексы?
ну дык, ежели разделяемый между тредами ресурс - конечно жеж.
1
 Аватар для Воротислав
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
27.03.2017, 12:04  [ТС]
hoggy,
Спасибо.
Ну про ресурс, я так и подумал, хотя разделение так себе, один должен писать в конец очереди, другой должен из начала вытаскивать. Ну хотя если внезапно очередь пустая, и транспорт начал писать... ну в общем, я понял.
Я думал про тред-пул, но если честно не придумал для него задач. Чтобы ожидания епола не блокировали выполнения цикла, в качестве таймаута я ему передаю 0. И следовательно, его надо либо дергать каждый раз, либо вытащить в поток. Тут мне нужен один поток, который будет крутить свой вечный цикл и обрабатывать сообщения из сети. Причем у него есть пара типов сообщений, один тип он должен сам обрабатывать, второй тип он должен положить в очередь сообщений. И тут же прочитать есть ли сообщения из очереди на запись, если есть поотправлять несколько (или все).
И всё же, не подскажите, как правильнее: один метод из класса транспорт (например
C++ (Qt)
1
run() { while(true)... }
) или же весь экземпляр класса засунуть в std::thread?
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
28.03.2017, 12:17
Цитата Сообщение от Воротислав Посмотреть сообщение
Чтобы ожидания епола не блокировали выполнения цикла
пускай блокируют.
эта задача - в отдельном потоке.
он ждёт.
сообщение получил,
коллбек дернул.
ждет дальше.

Цитата Сообщение от Воротислав Посмотреть сообщение
И всё же, не подскажите, как правильнее: один метод из класса транспорт
мне не понятно, что за транспорт и нафиг он нужен.

у вас два потока. один отправляет по необходимости,
другой ожидает входящие.
все.
два треда.
1
 Аватар для Воротислав
127 / 105 / 27
Регистрация: 25.02.2010
Сообщений: 451
28.03.2017, 13:42  [ТС]
hoggy,
Вы не поняли :-) Когда я спрашивал, еще не было ни тредов, ни практики, ни знаний как использовать эти треды. Я просто читал, и попутно прикидывал как буду делать.
Сегодня вынес класс по работе с сокетом в отдельный поток, и запустил там вечный цикл. В основной программе так же цикл крутится. Вроде пока всё работает. Спасибо)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.03.2017, 13:42
Помогаю со студенческими работами здесь

Можно ли использовать std::thread в С++ Builder?
Доброго всем времени суток. Возник вот такой вопрос. Можно ли использовать подход написания многопоточных приложений в C++ Builder...

Embarcadero Berlin. Отсутствуют библиотеки многопоточности (thread,mutex) в std под платформу win 32bit
Господа, я тут на Берлин переехал, т.к. очень понадобилась многопоточность и лучшая ее реализация по умолчанию идет только с C++11, который...

C++ std::thread разное поведение на linux и windows
Столкнулся с странным поведением std::thread, при использовании метода detach. Пример кода: #include <iostream> #include...

Использование std::function в std::thread
Нужно вызвать function fnc в новом потоке. Как сделать? function <void(vector<char>)> fnc; void test(vector<char> data) { ...

Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list"
Не могу сообразить почему возникает ошибка. У меня в классе есть метод, который должен работать в нескольких потоках одновременно. Вот он: ...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
Доступность команды формы по условию
Maks 07.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru