谁是std :: Future的创造者
Who is the creator of a std::future?
cppReference对 std::future
说
异步操作的创建者可以使用多种方法来查询,等待或从std :: Future中提取值。
谁是异步操作的创造者?是创建std::future
对象还是可以访问该对象的任何线程的线程?最后,我的问题是非创建者是否也可以在std::future
上使用get
方法。
特别是我想知道此代码是否正确:
std::future<int> foo;
std::thread t([&foo](){
foo = std::async(std::launch::async, [](){ return 4; });
});
t.join();
int n = foo.get(); // can the main thread call foo.get()?
谁是异步操作的创造者?是创建STD :: Future对象还是可以访问该对象的任何线程的线程?
基本上有三件事可以创建这种"异步操作":
-
std::async
-
std::promise
-
std::packaged_task
这些"创建者"创建了一个所谓的共享状态,其中 std::future
获得了同等的共享访问权限。共享状态是存储此类操作结果的地方。提供商(std::async
,std::promise
或std::packaged_task
对象)和消费者(获得的std::future
)都以线程安全的方式访问共享状态,您不应打扰您的实现细节。
最后,我的问题是非创建者是否也可以在
std::future
上使用GET方法。
原因;"异步操作"通常发生在不同的执行线程中,std::future
的目的是安全查询并访问其他地方的"异步操作"的结果,而无需您明确地使用任何您明确地使用任何事情额外的同步机制。
特别是我想知道此代码是否正确:
std::future<int> foo; std::thread t([&foo](){ foo = std::async(std::launch::async, [](){ return 4; }); }); t.join(); int n = foo.get(); // can the main thread call foo.get()?
虽然这个"特定的简短片段"似乎并没有引起种族条件;这绝不是一个好的代码。在任何时间点,从"异步操作"获得的 std::future
到共享状态不应一次使用多个线程。
在您的情况下,get()
和assignment operator
不是线程安全。迟早,此代码将迅速增长以调用种族条件
另外一个注意,不需要在您的代码中使用std::thread
,实际上,当您的启动策略为 std::launch::async
时,体面的实现将创建新线程或使用线程池。因此,您应该只做:
std::future<int> foo = std::async(std::launch::async, [](){ return 4; });
int n = foo.get();
- 架构决策:返回std::future还是提供回调
- 使用用户定义的参数调用future/async并调用类方法
- std::p romise::set_value() 和 std::future::wait() 是否提供内存围栏?
- 修改在 std::future 的 lambda 中引用捕获的值
- 从 T 创建 std::future 的最佳方式<T>
- C++ std::future没有被调用
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 如何使用 boost::future 重新抛出 std::exception_ptr 存储的原始异常?
- Make zmqpp::socket::connect a std::future
- std::future可以比std::promise活得更长吗
- std::future::get()或std::future::wait()是std::thread::join()的替
- 使用 future 时获取 C2280(尝试引用已删除的函数)
- 当 std::future 准备好被检索时发出信号主线程
- C++ std::future 方法应该<T>命名为 is_ready() 还是 ready()?
- 为什么printf会导致与future.get的死锁,而cout则不会?
- 当多次调用时,"std::future::then"的行为是什么?
- 使用 std::vector<std::future<int>> 和 std::async 启动几个线程时中止
- 使用 std::future 的不完整类型无效使用
- boost::future::那它是如何实现的?
- 谁是std :: Future的创造者