使用C ++ 98的活动对象

时间:2012-02-23 02:07:26

标签: c++ multithreading posix real-time

我想在我的嵌入式实时项目中雄辩地使用Active Objects 由Herb Sutter描述,“更喜欢使用活动物体而不是裸体物体 线程“。我有软实时要求和合理的处理器,所以我 不太担心分配/解除分配消息的运行时成本 到Active helper线程。虽然我坚持使用交叉编译器 不支持C ++ 0x功能(并添加到那个,我不能使用Boost),我相信我可以 在不使用TR1功能的情况下实现一般模式。但是,我在哪里 陷入困境是如何正确实现Future以获得异步结果 从Active对象返回?..将使用Posix互斥量和条件变量a 合理的方法..关于Posix消息队列的方式?

2 个答案:

答案 0 :(得分: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;
}

虽然显然你需要添加错误检查,并考虑例外情况。

答案 1 :(得分:1)

您可能需要查看开源QP/C++ state machine framework和我的书“C / C ++中的实用UML状态图:嵌入式系统的事件驱动编程”。

QP / C ++框架是实时嵌入式系统的活动对象计算模型的一种非常轻量级的实现,它强烈支持将活动对象的行为建模为分层状态机(UML statecharts)。特别是对于您的问题描述,框架已被移植到POSIX线程,其中每个活动对象在其自己的p线程中执行,并且具有自己的轻量级事件队列,该队列阻塞私有条件变量。有关该端口的更多信息,请参阅App Note "QP and POSIX"。 QP的完整代码可从SourceForge.net获得。