|
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
|
|
| 27.03.2017, 09:35 | |
|
Ответы с готовыми решениями:
4
Чтение переменной несколькими std::thread Ошибка "неопределенная ссылка" при работе с std::thread |
|
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. И следовательно, его надо либо дергать каждый раз, либо вытащить в поток. Тут мне нужен один поток, который будет крутить свой вечный цикл и обрабатывать сообщения из сети. Причем у него есть пара типов сообщений, один тип он должен сам обрабатывать, второй тип он должен положить в очередь сообщений. И тут же прочитать есть ли сообщения из очереди на запись, если есть поотправлять несколько (или все). И всё же, не подскажите, как правильнее: один метод из класса транспорт (например
0
|
||||||
|
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
|
|
| 28.03.2017, 13:42 | |
|
Помогаю со студенческими работами здесь
5
Можно ли использовать std::thread в С++ Builder? Embarcadero Berlin. Отсутствуют библиотеки многопоточности (thread,mutex) в std под платформу win 32bit
Использование std::function в std::thread Ошибка компиляции "no instance of constructor 'std::thread::thread' matches the argument list" Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |
|
Новые блоги и статьи
|
|||
|
модель ЗдравоСохранения 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.
Задача: сделать доступной кнопку (команда формы "ЗавершитьСписание") при. . .
|