gpt4 book ai didi

c++ - 如何解决 std::get<>() 缺乏并发规范的问题

转载 作者:IT老高 更新时间:2023-10-28 23:18:15 26 4
gpt4 key购买 nike

以下代码块:

  1. 在技术上无效,因为 std::get<>() 不是线程安全的。引用:Is using `std::get<I>` on a `std::tuple` guaranteed to be thread-safe for different values of `I`?

  2. 据我所知,现在和可预见的 future ,在所有 std::tuple<> 的实现中都是有效的。

    #include <tuple>
#include <atomic>
#include <thread>

// Out of my control
using data_t = std::tuple<int, int, int, int>;
void foo(data_t);
//

int main() {
data_t landing;
std::atomic<int> completed = 0;

// Whichever thread pings last will be the one performing foo()
auto ping = [&](){
if(++completed == 4) {
foo(landing);
}
};

std::thread a([&](){ std::get<0>(landing) = 1; ping(); });
std::thread b([&](){ std::get<1>(landing) = 2; ping(); });
std::thread c([&](){ std::get<2>(landing) = 3; ping(); });
std::thread d([&](){ std::get<3>(landing) = 4; ping(); });

a.join();
b.join();
c.join();
d.join();

return 0;
}

为了让事情变得更有趣,实际的代码充满了可变参数模板,因此编写一个一次性着陆台结构来处理这种情况并不能解决问题。它必须是一个通用的解决方案。

我目前的选择是:

  • 使用重新编写的 std::tuple<> 文档有效地重新实现 std::get<>,这既浪费时间又浪费代码。
  • 插入 std::get<>(std::tuple) 提案以提供类似于 std::vector<> 的保证,并记录代码仅在尚未发布的标准版本中有效的事实。
  • 忽略这个问题,相信事实上,这几乎肯定会奏效。

这些在短期内都不是特别好......所以我的问题是:

  • 我是否遗漏了使第 2 点无效的内容?
  • 是否有更好的解决方法可以让实现在技术上有效,同时又不必支持过多的额外代码。
  • 欢迎就该主题提出任何其他意见。

最佳答案

Push a proposal for std::get<>(std::tuple) to provide guarantees similar to std::vector<>, and document the fact that the code is only valid as of a yet unreleased version of the the standard.

我认为这是要走的路,因为它为整个 C++ 社区提供了值(value),不应该成为实现者的负担。这也是一个绝佳的机会 write your first proposal .

我建议这样做,现在假设这会起作用,即使它是 UB。如果您的软件是 super 关键的(例如飞行控制系统),并且您希望 100% 确定您不依赖于将来可能会损坏的东西...然后实现您自己的 tuple .

关于c++ - 如何解决 std::get<>() 缺乏并发规范的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56497862/

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