2012-02-23 6 views
0

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

+0

Вы не можете использовать boost, но, возможно, вы можете увидеть, как они реализуют свои будущие классы, поскольку в какой-то момент им придется полагаться на pthread ... –

ответ

1

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

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

Конечно, буфер должен быть распределен динамически, поэтому он может быть разделен между потоком активного объекта и ожидающим потоком и уничтожен должным образом, поэтому используйте что-то вроде 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; 
} 

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

+0

Спасибо, что немного очистил. Правильно ли считать, что ref_counted_ptr не гарантирует безопасность потока для этого шаблона использования? – giantrobot

+0

Нет. Причина, по которой вам это нужно, подсчитывается, потому что поток, определяющий результат, и поток, читающий результат, удерживает указатели на том же объекте 'future_data'. Вам нужно будет убедиться, что настройка счетчика является потокобезопасной, так что только один поток пытается уничтожить объект 'future_data', и это делается в правильное время. –

1

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

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

Смежные вопросы