LINUX.ORG.RU

ожидание событий в main() от потоков (threads) (нуб)

 , ,


1

1

Добрый день, ЛОР. Вопрос нубский. Но, для меня, пока неясен.

Что имеем: main() и 4 потока (threads) Потоки опрашивают из своих fd и передают в свои fd данные. Здесь используем epoll(). Тут понятно.

Данные от потоков и в потоки передаются в main() через глобальные переменные.Для факта наличия новых данных используются флаги. И все это в while(1). Вот этот момент и не нравится.

Ткните носом, как это правильно можно реализовать? Можно ли использовать epoll() в main() (получается создав fd между потоками и main?)? Граммотно ли это?


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

anonymous
()

Данные от потоков и в потоки передаются в main() через глобальные переменные.

Не стоит так делать.

mix_mix ★★★★★
()

И все это в while(1). Вот этот момент и не нравится.

В случае небольших нагрузок, цикл — это вполне нормальное рабочее решение, а вот глобальные переменные — это зло. Наиболее распространённый вариант — это очередь, рабочие потоки напихивают данные в очередь, обработчик в своём потоке забирает данные из очереди и что-то с ними делает. Очередь, естественно, нужна потокобезопасная.

Gvidon ★★★★
()
Последнее исправление: Gvidon (всего исправлений: 1)

Про очередь уже написали, добавлю, что тебе стоит поработать над архитектурой твоего приложения. Например, в главном потоке получать данные (хоть через epoll, хоть как), класть их в очередь, а рабочие потоки уже пусть сами из неё берут, когда будут готовы. Иначе толку от потоков получается немного. Конечно, может быть так, что каждый поток обрабатывает свой тип данных и по-своему, но даже в этом случае лучше переделать, чтобы сбор был отдельно, обработка — отдельно (и выдача тоже отдельно). Очередей в таком случае будет больше

XMs ★★★★★
()

имеем: main() и 4 потока (threads)

То есть у тебя 5 потоков?

Если ты используешь epoll(), то для обмена информации между потоками можно использовать дополнительные файловые дескрипторы, скажем, созданные через pipe() или socketpair(). С помощью таких FIFO можно через epoll извещать о событиях, а данные пробрасывать отдельно через общую память, а можно в FIFO заталкивать сами данные.

Последний вариант хорош изоляцией данных между потоками, но этот способ не самый быстрый. Можно делать обмен через какую-нибудь lock-free очередь, размещенную в общей памяти.

pathfinder ★★★★
()
Ответ на: комментарий от pathfinder

Спасибо! Теперь понятно. От глобальных переменных отказываемся - раз. Организуем очередь в main() - два. Просто у меня, читая книги, сложилось ошибочное мнение, что методы IPC только для связи между процессами и для потоков не применяются.

salik
() автор топика

Судя по описанию, тебе нах не упали 5 потоков. Тебе нужен один с одним epoll.

Pavval ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.