gpt4 book ai didi

c++ - 在 std::thread 中使用 std::move

转载 作者:行者123 更新时间:2023-11-30 02:35:10 24 4
gpt4 key购买 nike

我遇到了 std::thread 的另一个问题,这次是在应用 std::move 交换 2 个值时。我的代码说:-

#include <iostream>
#include <thread>
using namespace std;
void swapno (int &&a, int &&b)
{
int temp=move(a);
a=move(b);
b=move(temp);
}
int main()
{
int x=5, y=7;
cout << "x = " << x << "\ty = " << y << "\n";
// swapno (move(x), move(y)); // this works fine
thread t (swapno, move(x), move(y));
t.join();
cout << "x = " << x << "\ty = " << y << "\n";
return 0;
}

输出:-

x = 5   y = 7
x = 5 y = 7

现在这个方法有什么问题?为什么这样的代码显示出这样的行为?我该如何纠正它?

最佳答案

这是因为线程 constructor你在打电话

copies/moves all arguments (both the function object f and all args...) to thread-accessible storage as if by the function:

template <class T>
typename decay<T>::type decay_copy(T&& v) {
return std::forward<T>(v);
}

std::decay将删除 cv 限定符,其中包括 r 值引用。

因此,当 std::thread 将参数复制/move 到线程可访问存储时,它本质上是 move 构造它自己的 int从你提供的那些,因为 int 上的 move 只是一个拷贝,当你对其值执行 swapno 时,你是在拷贝上做。

要更正它,请使用 std::ref 加上 swap:

std::thread t ([](int& a, int& b){std::swap(a, b);}, std::ref(x), std::ref(y));
t.join();

Live Demo

关于c++ - 在 std::thread 中使用 std::move,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33895715/

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