我想在我的嵌入式实时项目中使用活动对象,正如Herb Sutter雄辩地描述的那样,“首选使用活动对象而不是裸线程”。我有软实时需求和合理的处理器,所以我不太担心分配/取消分配消息到活动助手线程的运行时成本。尽管我遇到了不支持C++0x特性的交叉编译器(而且我不能使用Boost),但我相信我可以在不使用TR1特性的情况下实现通用模式。但是,我被卡住的地方是,我如何正确地实现Future,以便使用Posix互斥锁和条件变量成为关于Posix消息队列的合理approach..how,从活动对象?..would中获取异步结果?
发布于 2012-02-23 16:20:42
未来本质上是一个用来保存结果的缓冲区的包装器,一个用来指示它已准备就绪的标志,一个用来保护对它的访问的互斥锁,以及一个用于等待的条件变量。
如果您了解该平台的底层设施,则可能能够对其进行优化,但这是基本的设置。
当然,缓冲区必须是动态分配的,所以它可以在活动对象线程和等待线程之间共享,并被正确销毁,因此可以使用类似于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;
}尽管很明显,你需要添加错误检查,并考虑到异常。
发布于 2012-08-19 01:09:16
您可能想看看开源QP/C++ state machine framework和我的书"Practical UML Statecharts in C/C++:Event-driven programming for Embedded Systems“。
QP/C++框架是实时嵌入式系统中活动对象计算模型的一个非常轻量级的实现,它支持将活动对象的行为建模为分层状态机(UML statecharts)。具体地说,框架已经移植到POSIX线程,在POSIX线程中,每个活动对象都在自己的p线程中执行,并且有自己的轻量级事件队列,在私有条件变量上阻塞。有关端口的更多信息,请参阅App Note "QP and POSIX"。QP的完整代码可从SourceForge.net获得。
https://stackoverflow.com/questions/9406154
复制相似问题