如果你破坏了一个共享状态尚未就绪的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 ?
}