Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/3: Рейтинг темы: голосов - 3, средняя оценка - 4.67
126 / 104 / 27
Регистрация: 25.02.2010
Сообщений: 451
1

Pimpl + std::thread + linux sockets?

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

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

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

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

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

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

4
Эксперт С++
8423 / 3956 / 866
Регистрация: 15.11.2014
Сообщений: 8,908
27.03.2017, 11:06 2
я бы реализовал при помощи тред-пула.

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


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

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

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

у вас два потока. один отправляет по необходимости,
другой ожидает входящие.
все.
два треда.
1
126 / 104 / 27
Регистрация: 25.02.2010
Сообщений: 451
28.03.2017, 13:42  [ТС] 5
hoggy,
Вы не поняли :-) Когда я спрашивал, еще не было ни тредов, ни практики, ни знаний как использовать эти треды. Я просто читал, и попутно прикидывал как буду делать.
Сегодня вынес класс по работе с сокетом в отдельный поток, и запустил там вечный цикл. В основной программе так же цикл крутится. Вроде пока всё работает. Спасибо)
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.03.2017, 13:42

Заказываю контрольные, курсовые, дипломные работы и диссертации здесь.

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

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

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

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


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

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

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