gpt4 book ai didi

c++ - 将函数对象传递给线程对象的构造函数 - 复制?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:46:28 25 4
gpt4 key购买 nike

在《C++并发实战》一书中有一个例子:

    class background_task    {    public:        void operator() () const {            do_something();            do_something_else();        }    };    background_task f;    std::thread my_thread(f);

后跟文本:“在这种情况下,提供的函数对象被复制到属于新创建的执行线程的存储中并从那里调用。因此,拷贝的行为必须与原始对象或结果相同可能不是预期的那样。”

有人可以更详细地解释一下这两个句子的意思吗?可以提供给线程对象的构造函数的其他可调用类型呢,它们没有被复制吗?我如何确保“拷贝的行为与原始行为相同”或者为什么它的行为不相同?谢谢!

最佳答案

该语句将给定示例与紧接在普通函数 void do_some_work(); 作为参数传递给 std::thread 之前的情况进行对比。

std::thread my_thread(do_some_work);

函数对象 background_task f 应该是可复制的。如果 class background_task 包含使其不可复制的内容,则这是不可能的。例如,如果background_task 有一个 std::mutex,它将不可复制,因为 std::mutex不可复制或移动。参见 Demo

第二件事是,即使 background_task 是可复制的,也应该确保复制构造函数生成与原始任务完全相同的拷贝。没有发生这种情况的一个例子是众所周知的情况,其中类具有原始指针并且复制构造函数不执行深层复制。

可调用的void do_some_work();也像函数对象一样复制到线程中,但不会面临上述问题。

关于c++ - 将函数对象传递给线程对象的构造函数 - 复制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55446686/

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