gpt4 book ai didi

c++ - 与 C++ std::future 的数据竞争。编译器重新排序

转载 作者:行者123 更新时间:2023-11-28 06:23:02 26 4
gpt4 key购买 nike

我正在编写一个异步访问数据库的应用程序。在我的示例中,序列化由 handleAllGroups 函数处理。这个函数采用一个仿函数,它实际上对数据库对象起作用。由于我对返回的类型不满意,所以我将所有内容都包装在一个延迟的异步调用中,以创建我想要的。一切似乎都很顺利。我仍然有点担心数据竞争,因为我没有原子或互斥保护。

问题:编译器是否可能决定在 fut.wait() 之前执行 std::move(*data)?这很重要,因为数据与其他线程共享! (ftor 拥有共享所有权并通过 handleAllGroups 在数据库线程中调用)

感谢任何帮助!

handleGroupCol_ftor
make_getGroupNamesFtor(std::shared_ptr<std::vector<std::string>>& data);

std::future<MayBeStrVector>
getAllGroupNames()
{
// FIXME: This function is fine, but relies on ftor not
// sharing ownership of data in other places (the move)
auto data = std::make_shared<std::vector<std::string>>();
auto ftor = make_getGroupNamesFtor(data);
return std::async(std::launch::deferred,
[data](std::future<result>&& fut)->MayBeStrVector{
fut.wait();
return {fut.get(), std::move(*data)};
},
handleAllGroups(ftor));
}

最佳答案

假设对另一个线程上指向的data 的所有写入都在making-fut-ready 之前排序,那么您是安全的。 [futures.state]/p9:

Calls to functions that successfully set the stored result of a shared state synchronize with (1.10) 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 (1.10) the successful return from a call to a waiting function on the shared state.

不要陷入标准语的泥潭,这里的同步关系意味着在设置结果的线程中设置存储结果的调用之前排序的所有内容发生在 在 wait() 调用之后排序的所有内容。

关于c++ - 与 C++ std::future 的数据竞争。编译器重新排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29026607/

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