已关闭。此问题需要details or clarity。目前不接受回答。
**要改进此问题吗?**通过editing this post添加详细信息并阐明问题。
昨天就关门了。
Improve this question的
当T1执行func_1()时,我可以使用std::move()将所有权从线程T1移动到T2吗
我不知道这是不是正确的方法?有人说我们不应该在线程运行时移动所有权。我们应该在运行线程之前移动所有权。你能告诉我什么是正确的方法吗?怎么做?
#include <iostream>
#include <thread>
#include <chrono>
void func_1()
{
while (true)
{
std::cout << "thread_id :" << std::this_thread::get_id() << std::endl;
int x = 0;
while (x < 2000)
{
std::cout << "x :" << x << std::endl;
x++;
}
break;
}
}
int main()
{
std::thread T1(func_1);
std::thread T2(std::move(T1));
T2.join();
}
字符串
1条答案
按热度按时间kcrjzv8t1#
有人说我们不应该在线程运行的时候移动所有权,我们应该在线程运行之前移动所有权。
这是完全错误的。当
std::thread
对象管理一个正在运行的线程时,移动std::thread
对象没有任何问题。移动不会以任何方式影响线程的执行。它只是将线程的管理移交给移动的目标std::thread
对象。您显示的代码很好,并且与
字符串
在
main
中,事实上,before 线程开始运行一个
std::thread
对象只能处于default-constructed或moved-from状态。从这样的状态移动是完全没有意义的。所以不知道为什么有人会把它作为一个用例。也许这是一个误解,你听到的是你不应该把一个
std::thread
对象移动到另一个已经管理一个正在运行的线程的std::thread
对象中。这是行不通的,因为让目标std::thread
对象管理源std::thread
对象管理的线程需要首先放弃对目标已经管理的线程的管理,也就是说,如果它处于可连接状态,它必须首先被连接,就像std::thread
的析构函数所要求的那样。