Боюсь, я не могу помочь с (1), но в отношении двух других вопросов:
(2) Я обнаружил, что в архитектуре boost::asio
есть некоторые издержки, которые не являются детерминированными, то есть, что задержки между поступлением данных (или отправкой на объект службы ввода-вывода) могут отличаться от практически мгновенного ответа до порядка сотен миллисекунд. Я попытался измерить это как часть другой проблемы, которую я пытался решить в отношении регистрации и метки времени данных RS232, но не получил каких-либо окончательных результатов или способов стабилизации задержки. Я не удивлюсь, если обнаружу, что подобные проблемы существуют с компонентом переключения контекста.
(3) Что касается использования boost::asio
для задач, отличных от асинхронного ввода-вывода, то теперь это мой стандартный инструмент для большинства асинхронных операций. Я все время использую таймеры boost::asio
для асинхронных процессов и для генерации таймаутов для других задач. Возможность добавления нескольких рабочих потоков в пул означает, что вы можете хорошо масштабировать решение и для других асинхронных задач с высокой нагрузкой. Мой самый простой и любимый класс, который я написал в прошлом году, - это крошечный класс рабочих потоков для boost::asio
служб ввода-вывода (извините, если есть какие-либо опечатки, это транскрипция из памяти, а не вырезка и вставка):
class AsioWorker
{
public:
AsioWorker(boost::asio::io_service * service):
m_ioService(service), m_terminate(false), m_serviceThread(NULL)
{
m_serviceThread = new boost::thread( boost::bind( &AsioWorker::Run, this ) )
}
void Run( void )
{
while(!m_terminate)
m_ioService->poll_one();
mySleep(5); // My own macro for cross-platform millisecond sleep
}
~AsioWorker( void )
{
m_terminate = true;
m_serviceThread->join();
}
private:
bool m_terminate;
boost::asio::io_service *m_ioService;
boost::thread *m_serviceThread;
}
Этот класс - отличная маленькая игрушка, просто добавьте new
по мере необходимости и delete
, когда закончите с ними. Вставьте std::vector<AsioWorker*> m_workerPool
в класс устройств, который использует boost::asio
, и вы сможете еще больше обернуть элементы управления пулом потоков. Я всегда испытывал желание написать интеллектуальный авто-менеджер пула, основанный на времени, чтобы увеличить пул потоков соответствующим образом, но у меня еще не было проекта, где это было необходимо.
Что касается удовлетворения вашего интереса к безопасности потоков, то можно покопаться в интуиции форсирования, чтобы точно узнать, как они делают то, что делают. Лично я всегда принимал большинство вещей повышения за чистую монету и предполагал из прошлого опыта, что он довольно хорошо оптимизирован под капотом.