Активные объекты с C ++ 98 - PullRequest
       22

Активные объекты с C ++ 98

0 голосов
/ 23 февраля 2012

Я бы хотел использовать активные объекты в моем встроенном проекте реального времени, как красноречиво описал Херб Саттер, «Предпочитать использовать активные объекты вместо голых потоков».У меня есть требования мягкого реального времени и разумный процессор, поэтому я не слишком беспокоюсь о затратах времени выполнения для выделения / отмены выделения сообщений в потоке вспомогательного помощника.Хотя я застрял с кросс-компилятором, который не поддерживает функции C ++ 0x (и, кроме того, я не могу использовать Boost), я считаю, что могу реализовать общий шаблон без использования функций TR1.Но где я застреваю, как правильно реализовать Future для получения асинхронного результата от объекта Active? .. Разумно ли использовать мьютексы Posix и условные переменные ... как насчет очередей сообщений Posix?

Ответы [ 2 ]

1 голос
/ 18 августа 2012

Возможно, вы захотите взглянуть на открытый исходный код Структура конечного автомата QP / C ++ и мою книгу "Практические диаграммы состояний UML в C / C ++: программирование на основе событий для встроенных систем".

Каркас QP / C ++ - это очень легкая реализация вычислительной модели активного объекта для встроенных систем реального времени с сильной поддержкой моделирования поведения активных объектов в виде иерархических конечных автоматов (UML-диаграмм состояний). Специально для вашего описания проблемы, платформа была портирована на потоки POSIX, где каждый активный объект выполняется в своем собственном p-потоке и имеет свою собственную облегченную очередь событий, которая блокирует частную переменную условия. Пожалуйста, смотрите Приложение Note "QP and POSIX" для получения дополнительной информации о порте. Полный код для QP доступен по адресу SourceForge.net .

1 голос
/ 23 февраля 2012

Будущее - это, по сути, оболочка вокруг буфера для хранения результата, флаг, указывающий, что он готов, мьютекс для защиты доступа к нему и переменная условия для ожидания.

Если вы знаетенизкоуровневые средства платформы, вы можете оптимизировать его, но это базовый набор.

Конечно, буфер должен быть распределен динамически, поэтому он может быть разделен между активным потоком объектаи ожидающий поток, и уничтожен должным образом, поэтому используйте что-то вроде ref_counted_ptr<future_data>.

. Получение значения будет примерно таким:

DataType future_data::get() {
    pthread_mutex_lock(&mut);
    while(!data_ready)
        pthread_cond_wait(&cond,&mut);

    DataType temp=get_buffer_value();
    pthread_mutex_unlock(&mut);
    return temp;
}

Хотя, очевидно, вам нужно будет добавить ошибкупроверка и учет исключений.

...