【问题标题】:Active Objects with C++98使用 C++98 的活动对象
【发布时间】:2012-02-23 02:07:25
【问题描述】:

我想在我的嵌入式实时项目中雄辩地使用 Active Objects 由 Herb Sutter 描述,“更喜欢使用活动对象而不是裸体 线程”。我有软实时要求和合理的处理器,所以我 不太担心分配/取消分配消息的运行时成本 到活动帮助线程。虽然我被一个交叉编译器困住了 不支持 C++0x 功能(此外,我不能使用 Boost),我相信我可以 在不使用 TR1 特性的情况下实现通用模式。但是,我在哪里 卡住是我如何正确实现 Future 以获得异步结果 从活动对象返回?..将使用 Posix 互斥锁和条件变量 合理的方法..Posix 消息队列怎么样?

【问题讨论】:

  • 你不能使用 boost,但也许你可以看到他们如何实现他们未来的类,因为他们在某些时候不得不依赖 pthread ...

标签: c++ multithreading posix real-time


【解决方案1】:

Future 本质上是一个包装器,用于保存结果的缓冲区、一个指示它已准备就绪的标志、一个用于保护对其访问的互斥锁以及一个等待的条件变量。

如果你知道平台的底层设施,你也许可以优化它,但这是基本的设置。

当然,缓冲区必须是动态分配的,所以它可以在活动对象线程和等待线程之间共享,并且可以正确销毁,所以使用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 不必保证这种使用模式的线程安全是否正确?
  • 没有。你需要它的原因是因为设置结果的线程和读取结果的线程都持有指向同一个future_data对象的指针。您需要确保调整计数是线程安全的,这样只有一个线程会尝试销毁 future_data 对象,并且这是在正确的时间完成的。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2012-01-15
    • 1970-01-01
    • 2014-08-16
    • 2020-10-28
    • 2010-12-19
    相关资源
    最近更新 更多