Как правильно организовать вечный цикл в отдельном потоке C++11?

Доброго времени суток.
Есть задача постоянно слушать сокеты, ну и что-то с этим всем делать, класс назван Transport.
Т.к. типы сокетов бывают разные + в конечном классе совсем не надо показывать внутренности - сделал через pimpl.
Теперь дальше, в основной программе крутится вечный цикл, и в начале каждой итерации происходит обращение к моему классу, там вызывается epoll_wait. Для того, чтобы епол не блокировал исполнение вечного цикла, параметр таймаута выставил в 0.
Хочу сделать следующее, чтобы в основной программе не вызывать постоянно функцию Transport, вынести последний в отдельный поток со своими вечным циклом. И добавить 2 очереди, одна на прием, вторая на отправку. И они должны быть обе видны из основной программы, т.е. в начале итерации цикла, программа смотрит что есть в очереди на прием, вычитывает(вынимает) сообщения, дальше в цикле где то записывает информацию в очередь на отправку. Transport в свою очередь в вечном цикле опрашивает епол, если что-то вычитал, записывает в очередь на прием и постоянно просматривает очередь на отправку, если не пустая - отправляем. Вопрос в следующем, с потоками на c++11 не работал, есть опыт только с Qt-потоками, поэтому прошу вашей помощи. Лучше весь класс запихать в поток, если только его вечный цикл? Если только цикл, как будет выглядить доступ из потока до очередей? Если весь класс, то метода положить в очередь, и получить из очереди обворачивать в мьютексы?
Ну и, как я понял, при создании потока, надо сразу сделать detach?
Заранее благодарен.
  • Вопрос задан
  • 651 просмотр
Пригласить эксперта
Ответы на вопрос 1
TrueBers
@TrueBers
Гуглю за еду
А зачем вам тогда epoll? Чем он, в вашем случае, будет отличаться от обычного блокирующего сокета в отдельном потоке?
Его смысл как раз в асинхронности и неблокируемости, а вы эти плюшки сводите на нет, вводите тормозящие мьютексы, очереди.
Раз уж пишете на плюсах асинхронно, то возьмите библиотеку для этого, тот же Asio.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы