c++ 线程:将线程函数包装在 lambda 中

问题描述 投票:0回答:1
#include <iostream>
#include <thread>

class MyClass {
public:
    MyClass(int val) : val_(val) {}

    int val_{0};
};

void threadFunction(MyClass myObj) {
    // do something ...
}

int main() {
    MyClass obj(42);

    std::thread t1(threadFunction, obj); 
    std::thread t2([=]() {
        threadFunction(obj);
    });

    t1.join();
    t2.join();

    return 0;
}

在线程

t1
中,我直接调用
threadfunction
,而在线程
t2
中,我将
threadFunction
的调用放在lambda中。 这两种创建线程的方式等效吗?

c++ multithreading lambda
1个回答
0
投票

替代方案之间的唯一区别与

MyClass obj
对象的副本或移动有关。

在第一种情况下,

std::thread
构造函数将复制
obj
,然后当新线程调用该函数时,它将被移动。

参见 演示1

在第二种情况下,当执行 lambda 时将会有一个额外的副本并会调用

threadFunction

参见演示2

第三种选择是使用 lambda 并通过引用捕获。
这将减少到只有一份副本。

参见演示3

© www.soinside.com 2019 - 2024. All rights reserved.