【问题标题】:std::promise in realtime context实时上下文中的 std::promise
【发布时间】:2018-06-27 08:27:39
【问题描述】:

我正在开发一个具有实时上下文的应用程序。

在实时上下文中执行的线程之一将Task 消息对象从邮箱中取出(具有实时功能)。那些Task 消息包含std::promisecommand

线程获取Task后执行命令,然后调用std::promise::set_value()

因此,我担心调用std::promise::set_value() 可能没有实时功能。

有人知道set::value() 是在内部分配堆存储还是做了其他会破坏实时能力的事情?

这里有一些snipplet,希望能让我的问题更清楚:

void RealTimeThread::exec()
{
  while( active_ ) {
    Task receivedTask;

    if( mailbox_.getMailTimed( receivedTask, std::chrono::milliseconds( 100 ) ) ) {
      try {
        if( receivedTask.cmd ) {
          receivedTask.cmd->execute();
        } else {
          // TODO: some internal actions on timeout
          throw std::runtime_error{"Command invalid"};
        }

        // does the following call has real-time capabilities?
        receivedTask.cmdPromise.set_value();
      } catch( ... ) {
        receivedTask.cmdPromise.set_exception( std::current_exception() );
      }
    }
  }
}

【问题讨论】:

  • 旁白:你似乎在复制packaged_task
  • 谢谢,这对我来说是新的。
  • 太糟糕了,没有人可以帮助我:-/

标签: c++11 promise c++14 real-time


【解决方案1】:

如果有人感兴趣:

可以在给定分配器的情况下构造std::promise。这用于分配用于std::future 对象的“共享状态”。

如果您可以提供实时分配的allocator(确定性),则可以在这种情况下使用std::promise。 这样的allocator 是从应用程序进入实时上下文之前分配的内存块中分配的。

【讨论】:

    猜你喜欢
    • 2015-12-25
    • 2014-11-10
    • 1970-01-01
    • 2022-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-03
    相关资源
    最近更新 更多