Использует ли boost::asio::deadline_timer поток для каждого таймера?
-
18-09-2019 - |
Вопрос
У меня есть список элементов, которые мне нужно обновлять с разной периодичностью.Список может вырасти до тысячи элементов в длину.Каждый элемент потенциально может иметь разный интервал.Если я создам по одному таймеру для каждого элемента, собираюсь ли я насытить систему потоками?Я подумал, что, возможно, было бы лучше создать один таймер, равный наименьшему интервалу в наборе элементов, а затем при каждом обновлении увеличивать счетчик, а затем проверять, равен ли счетчик теперь каким-либо другим интервалам.Это должно сработать при условии, что наименьший интервал кратен всем остальным интервалам.Есть какие-нибудь предложения?
Решение
Boost не использует поток для каждого таймера, он сохраняет очередь таймера.Каждый таймер создается с помощью boost::asio::io_service
объект, который выполняет фактическую работу.
Этот объект может отправлять свою работу в одном или нескольких потоках, когда ты бежишь boost::asio::io_service::run()
явно из нескольких потоков, но между таймерами и потоками нет однозначного соответствия, и Asio не будет создавать потоки за вашей спиной.
Другие советы
Последние версии из Asio, Boost 1.43 и более поздних версий, используйте timerfd_create(2)
API в Linux для deadline_timer
s.
Изменен на использование timerfd для отправки таймеров в Linux, когда они доступны .