当T1在c++中运行/执行其任务时,我可以将所有权从线程T1移动到T2吗?mulithreading [关闭]

jdg4fx2g  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(85)

已关闭。此问题需要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();
}

字符串

kcrjzv8t

kcrjzv8t1#

有人说我们不应该在线程运行的时候移动所有权,我们应该在线程运行之前移动所有权。
这是完全错误的。当std::thread对象管理一个正在运行的线程时,移动std::thread对象没有任何问题。移动不会以任何方式影响线程的执行。它只是将线程的管理移交给移动的目标std::thread对象。
您显示的代码很好,并且与

std::thread T1(func_1);
T1.join();

字符串
main中,
事实上,before 线程开始运行一个std::thread对象只能处于default-constructed或moved-from状态。从这样的状态移动是完全没有意义的。所以不知道为什么有人会把它作为一个用例。
也许这是一个误解,你听到的是你不应该把一个std::thread对象移动到另一个已经管理一个正在运行的线程的std::thread对象中。这是行不通的,因为让目标std::thread对象管理源std::thread对象管理的线程需要首先放弃对目标已经管理的线程的管理,也就是说,如果它处于可连接状态,它必须首先被连接,就像std::thread的析构函数所要求的那样。

相关问题