Я бы хотел использовать Active Objects в моем встроенном проекте реального времени как красноречиво , описанный Хербом Саттером: «Предпочитайте использовать активные объекты вместо голых Темы». У меня есть требования к мягкому режиму реального времени и разумный процессор, поэтому я не слишком беспокоился о затратах времени исполнения для выделения/де-выделения сообщений в Active helper thread. Хотя я застрял в кросс-компиляторе, что не поддерживает функции C++ 0x (и добавить к этому, я не могу использовать Boost), я считаю, что могу реализовать общий шаблон без использования функций TR1. Но, где я получить застрял, как правильно реализовать Будущее получить асинхронный результат назад от Активного объекта? .. будет использовать мьютексы Posix и переменные условия быть разумным подходом . Как о очередях сообщений Posix ?Активные объекты с C++ 98
ответ
Будущее - это, по существу, обертка вокруг буфера для хранения результата, флаг, указывающий, что он готов, мьютекс для защиты доступа к нему и переменная условия для ожидания.
Если вы знаете низкоуровневые возможности платформы, возможно, вы сможете ее оптимизировать, но это базовый набор.
Конечно, буфер должен быть распределен динамически, поэтому он может быть разделен между потоком активного объекта и ожидающим потоком и уничтожен должным образом, поэтому используйте что-то вроде 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;
}
Хотя, очевидно, вам нужно добавить проверку на наличие ошибок, и счет исключения.
Спасибо, что немного очистил. Правильно ли считать, что ref_counted_ptr не гарантирует безопасность потока для этого шаблона использования? – giantrobot
Нет. Причина, по которой вам это нужно, подсчитывается, потому что поток, определяющий результат, и поток, читающий результат, удерживает указатели на том же объекте 'future_data'. Вам нужно будет убедиться, что настройка счетчика является потокобезопасной, так что только один поток пытается уничтожить объект 'future_data', и это делается в правильное время. –
Возможно, вы захотите взглянуть на исходный код QP/C++ state machine framework и мою книгу «Практические диаграммы состояний UML в C/C++: программирование, управляемое событиями для встроенных систем».
Платформа QP/C++ - это очень легкая реализация модели активных объектов для встроенных систем реального времени с сильной поддержкой моделирования поведения активных объектов в качестве иерархических состояний машин (диаграммы состояний UML). В частности, к описанию проблемы, инфраструктура была перенесена на потоки POSIX, где каждый активный объект выполняет свой собственный p-поток и имеет свою собственную легкую очередь событий, которая блокирует переменную частного условия. Дополнительную информацию о порту см. На странице App Note "QP and POSIX". Полный код для QP доступен от SourceForge.net.
- 1. Активные объекты - проблемы с реализацией
- 2. WPF и активные объекты
- 3. активные объекты из списка
- 4. Активные объекты @ Репликация аннотации представления
- 5. Признать активные объекты с емкостным сенсорным дисплеем
- 6. android Активные классы и объекты
- 7. Заменить шаблон в C++ 98
- 8. C++ 98 и threading
- 9. C++ 98: Thread остановлен
- 10. вектор C++ 98 ошибка
- 11. Функтор C++ (C++ 98) с несколькими конструкторами?
- 12. Замок/Активные записи: Как вы считаете объекты?
- 13. C++ 11 move semantics vs C++ 98
- 14. Активные соединения с HTTPClient C#
- 15. G ++ сужение конверсий с C++ 98
- 16. Meyers Singleton поточно с C++ - 98
- 17. CRM 2011 Активные объекты на родительском
- 18. Как изменить активные объекты? in Materialize navbar
- 19. Переход на C++ 0x из C++ 98
- 20. C++ 98/C++ 03 STL ошибка набора?
- 21. Скомпилируется с C++ 11 медленнее, чем с C++ 98?
- 22. Обновление кода C++ 98 до C++ 11
- 23. Поддерживая одновременно C++ 98 и C++ 11
- 24. Как использовать активные объекты с аннотацией в atlassian sdk
- 25. Обновление с C++ 98 до C++ 11 вызывает ошибку
- 26. Поиск пространства имен C++ 11 изменен с C++ 98?
- 27. -std = C++ 98 и OS X 10,10
- 28. C++ 98/03 std :: is_constructible реализация
- 29. C++ 98 штамп времени для EPOCH
- 30. C++ 98 curly brace const скалярная инициализация
Вы не можете использовать boost, но, возможно, вы можете увидеть, как они реализуют свои будущие классы, поскольку в какой-то момент им придется полагаться на pthread ... –