如何使用C++std::barrierarrival_token?
How to use C++ std::barrier arrival_token?
我在分别使用 std::barrier
arrive
和 wait
函数时总是遇到编译器错误。
我一直在尝试寻找使用这些函数的示例,但我找不到它们,所以我现在只是在疯狂地拍摄。
它抱怨说我的到达标记不是右值,所以我更改了声明以使用 &&
,但我不太熟悉右值的工作原理。
代码如下:
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));
我在分别使用 std::barrier
arrive
和 wait
函数时总是遇到编译器错误。
我一直在尝试寻找使用这些函数的示例,但我找不到它们,所以我现在只是在疯狂地拍摄。
它抱怨说我的到达标记不是右值,所以我更改了声明以使用 &&
,但我不太熟悉右值的工作原理。
代码如下:
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));