gpt4 book ai didi

c++ - 使用类成员函数创建 std::thread - 最佳实践

转载 作者:行者123 更新时间:2023-11-28 01:14:35 26 4
gpt4 key购买 nike

假设我们有一些类SomeAlgorithm,它已经用一堆数据和其他变量进行了初始化。我们现在要使用它的成员函数execute开始计算。让我们创建一个 std::thread 并将其join 到主线程。

#include <thread>
#include <memory>

class SomeAlgorithm {
public:
void execute();
private:
// variables, eg. std::vector<int> data
};

int main() {
// (1)
{
SomeAlgorithm a1;
std::thread t1(&SomeAlgorithm::execute, &a1);
t1.join();
}
// (2)
{
SomeAlgorithm* a2 = new SomeAlgorithm();
std::thread t2(&SomeAlgorithm::execute, a2);
t2.join();
delete a2;
}
// (3)
{
std::unique_ptr<SomeAlgorithm> a3(new SomeAlgorithm());
std::thread t3(&SomeAlgorithm::execute, a3.get());
t3.join();
}
}

创建这样一个线程的首选方法是什么?有什么最佳实践吗?就内存使用而言,确保释放分配的内存的最节省方式是什么?

最佳答案

切勿使用 (2)。这与线程无关。切勿使用显式 new。如果您需要拥有指针,请使用智能指针。

至于您示例中的 (3),您不需要指针。如果线程超出对象的范围,您将需要,例如:

std::thread t3;
{
auto a3 = std::make_unique<SomeAlgorithm>();
t3 = std::thread{&SomeAlgorithm::execute, std::move(a3)};
}

t3.join();

您的代码也存在一些问题。使用 make_unique。有一些微妙的错误会在没有它的情况下蔓延。正如我所说,永远不要使用显式的 new。但最重要的是,不要使用 get(),因为它会使智能指针的整个点无效。

至于(1)我个人更喜欢:

// (1)
{
SomeAlgorithm a1;
std::thread t1{[&]{ a1.execute(); }};
t1.join();
}

关于c++ - 使用类成员函数创建 std::thread - 最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59116016/

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