gpt4 book ai didi

c++ - 标准保证在移动 std::packaged_task 后安全使用 std::future 吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:06:30 26 4
gpt4 key购买 nike

假设我们有以下代码:

#include <iostream>
#include <future>

int main() {
auto packagedTask = std::packaged_task<int()>([] {
std::cout << "hello!\n";
return 10;
});

auto packagedTaskFuture = packagedTask.get_future();
auto packagedTaskPtr = std::make_shared<decltype(packagedTask)>(std::move(packagedTask));

auto v1 = packagedTaskFuture.valid(); // is valid
auto v2 = packagedTaskFuture.wait_for(std::chrono::seconds(0)); // timeout state
(*packagedTaskPtr)(); // execute task
auto v3 = packagedTaskFuture.wait_for(std::chrono::seconds(1)); // ready state
auto v4 = packagedTaskFuture.get(); // 10

return 0;
}

它在我的 Visual Studio 环境中运行完美,如您所见,我在将 std::packaged_task 移动到新创建的 std 之前检索了 std::future::shared_ptr。我查看了关于 std::packaged_task 的 C++ 标准,所以 §30.6.9.1 packaged_task(packaged_task&& rhs) noexcept p.6:

Effects: constructs a new packaged_task object and transfers ownership of rhs’s shared state to *this, leaving rhs with no shared state. Moves the stored task from rhs to *this.

和 §30.6.9 p.2 说:

When the packaged_task object is invoked, its stored task is invoked and the result (whether normal or exceptional) stored in the shared state. Any futures that share the shared state will then be able to access the stored result.

根据这些信息,我有两个问题:

1) 我说的对吗 std::packaged_task 将在 std::move 之后链接到同一个 std::future

2) 在其他线程中使用我的 std::shared_ptr 并在那里执行任务,从当前线程检查 std::future 是否安全?

最佳答案

所以标准讨论了一个(隐藏的)共享状态。该共享状态在 std::move 上移动基于拷贝。

对象——打包的任务、 future ——应该被认为是引用共享状态的各种智能指针。

存在 竞争条件,这可能是由多个线程中的共享状态交互引起的。唯一可能发生的竞争条件是,如果您从多个线程与同一个对象 进行交互,并且至少在一个线程中您调用了一个非 const 对象。方法。

C++ 并发原语中的“共享状态”是概念性的,甚至不能保证是一个对象。它没有方法。

所以,是的,是的。

有问题的部分是 33.6.5 共享状态 [futures.state]。/9 直接讲同步(基本上是“无竞争条件”):

Calls to functions that successfully set the stored result of a shared state synchronize with (6.8.2) calls to functions successfully detecting the ready state resulting from that setting. The storage of the result (whether normal or exceptional) into the shared state synchronizes with (6.8.2) the successful return from a call to awaiting function on the shared state.

关于move的措辞分布在拥有共享状态的各种类中,加上共享状态是什么的完整描述。引用的标准有点过分。

关于c++ - 标准保证在移动 std::packaged_task 后安全使用 std::future 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56793158/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com