Я ищу решение этой проблемы на C или C++.
Редактировать: уточнить. Это на Linux-системе. Решения, специфичные для Linux, абсолютно прекрасны. Кросс-блафор не вызывает беспокойства.Как выполнить метод в другом потоке?
У меня есть служба, которая работает в своей собственной теме. Эта услуга - это класс с несколькими методами, некоторые из которых должны выполняться в потоке собственной службы, а не в потоке вызывающего.
В настоящее время я использую методы-обертки, которые создают структуру с параметрами ввода и вывода, вставляют структуру в очередь и возвращают (если «команда» асинхронна) или дождаться ее выполнения (если «команда» синхронно).
На стороне потока служба просыпается, выталкивает структуру из очереди, вычисляет, что выполнять, и вызывает соответствующий метод.
Эта реализация работает, но добавление новых методов довольно громоздко: определите оболочку, структуру с параметрами и обработчик. Мне было интересно, есть ли более простые способы кодирования такой модели: метод класса, который выполняется в собственном потоке класса, а не в потоке вызывающего.
редактировать - вид заключения:
Кажется, что нет де-факто способ осуществить то, что я спросил, что не предполагает дополнительных усилий кодирования.
Я буду придерживаться того, с чем я столкнулся, он обеспечивает безопасность типа, сводит к минимуму блокировку, позволяет синхронизировать и асинхронные вызовы, а накладные расходы - довольно скромные.
С другой стороны, для этого требуется немного дополнительного кодирования, и механизм отправки может раздуваться по мере увеличения количества методов. Регистрация методов отправки при построении или наличие оберток делают эту работу, похоже, решают проблему, удаляют немного служебных данных и также удаляют некоторый код.
Вы получите предложения, не зависящие от платформы, используя Boost.Thread, но какая платформа? – 2010-11-24 16:34:30
Это на linux. Он не должен быть кросс-платформенным. – amso 2010-11-24 17:26:34