调用set_value_at_thread_exit后,std :: promise的析构函数的标准强制行为是什么?

时间:2016-03-31 05:19:04

标签: c++11

如果你破坏了一个共享状态尚未就绪的std :: promise,但有人调用了set_value_at_thread_exit(并且该线程尚未退出),那么预期的结果是什么?

我可以告诉,promise的析构函数应该将future_error异常(代码为broken_promise)存储到共享状态。但是,这似乎不是GNU / libstdc ++的行为,它将在对未来get()的调用中产生存储值(而不是抛出异常)。

基于我阅读cppreference对std::promise::set_value_at_thread_exit的描述,我得出了结论:

  

将值存储到共享状态而不立即使状态就绪。在具有线程局部存储持续时间的所有变量都被销毁之后,当前线程退出时状态就绪。

std::promise::~promise

  

放弃共享状态:

     
      
  • 如果共享状态已准备就绪,请将其释放。
  •   
  • 如果共享状态未就绪,则存储类型的异常对象   带有错误条件std :: future_errc :: broken_promise的std :: future_error使共享状态准备就绪并释放它。
  •   

例如代码:

#include <future>

void foo(std::promise<int> p)
{
  p.set_value_at_thread_exit(42);
  // p is destroyed here
}

int main()
{       
  std::promise<int> p;
  std::future<int>  f = p.get_future();
  std::thread t(foo, std::move(p));
  t.join();
  (void)f.get(); // Throw future_error or return 42 ?
}

0 个答案:

没有答案