如何使用C++std::barrierarrival_token?

How to use C++ std::barrier arrival_token?

我在分别使用 std::barrier arrivewait 函数时总是遇到编译器错误。

我一直在尝试寻找使用这些函数的示例,但我找不到它们,所以我现在只是在疯狂地拍摄。

它抱怨说我的到达标记不是右值,所以我更改了声明以使用 &&,但我不太熟悉右值的工作原理。

代码如下:

void thread_fn(std::barrier<>& sync_point)
{
    /* Do 1st task... */

    std::barrier<>::arrival_token&& arrival = sync_point.arrive();

    /* Do 2nd task... */

    /* Wait for everyone to finish 1st task */
    sync_point.wait(arrival);

    /* Do 3rd task... */
}

我得到编译错误:

test.cpp: In function ‘void thread_fn(std::barrier<>&)’:
test.cpp:12:21: error: cannot bind rvalue reference of type ‘std::barrier<>::arrival_token&&’ to lvalue of type ‘std::barrier<>::arrival_token’
   12 |     sync_point.wait(arrival);
      |                     ^~~~~~~

具有右值引用类型的变量是左值(arrival 是左值)。

std::barrier<>::wait需要一个arrival_token&&,所以你需要从左值移动:

sync_point.wait(std::move(arrival));