使用 make_shared<std::thread> 创建 shared_ptr<std::thread> 的实例

Posted

技术标签:

【中文标题】使用 make_shared<std::thread> 创建 shared_ptr<std::thread> 的实例【英文标题】:Creating an instance of shared_ptr<std::thread> with make_shared<std::thread> 【发布时间】:2014-02-14 13:54:32 【问题描述】:

考虑以下代码:

class A

    ....
    shared_ptr<std::thread> mThread;
    void Step();
    void LaunchTrhead();


void A::LaunchThread()

    ...
    mThread=make_shared<std::thread>(Step); // This line gives an error
    ...


void A::Step()

    ...

我正在尝试初始化共享指针mThread,以便它调用函数Step。但是,编译器给了我错误“invalid initialization of reference of type ... from expression of type 'unresolved overloaded function type'”。显然我在做一些愚蠢的事情,但我不能指望它。有人可以帮忙吗?提前致谢!

【问题讨论】:

【参考方案1】:

Step() 是一个非静态成员函数,因此它具有A* 类型的隐式第一个参数。调用时需要绑定A的当前实例。

mThread = std::make_shared<std::thread>(std::bind(&A::Step, this));

您也可以使用 lambda 代替 bind

mThread = std::make_shared<std::thread>([this] Step(); );

正如@Casey 在 cmets 中指出的那样,std::thread's constructor 对指向成员函数的指针进行了特殊处理,并假设后面的第一个参数是指向要调用成员函数的实例的指针或引用。这意味着您可以避免 bind 并直接将 this 作为第二个参数传递。

mThread = std::make_shared<std::thread>(&A::Step, this);

【讨论】:

现场!编译器告诉我(“未解析的函数”),但我只是看不到它,我完全被蒙蔽了(我应该回家......)。另外,根据您所指出的,我可以将 Test 声明为静态的。但是在我的情况下,您的解决方案更实用,因为它避免了将指针传递给所有者对象。谢谢! 您可以将指向成员的指针和指向对象的指针直接传递给std::thread 构造函数(以及std::bindstd::async):mThread = std::make_shared&lt;std::thread&gt;(&amp;A::Step, this); 非常感谢凯西,这是一个更优雅的解决方案 :) @Casey 我们如何传递带有 1 个或多个参数的函数?假设函数步骤有一个“函数指针”作为参数,那么语法是什么? @VatsalAggarwal 将附加参数传递给thread 的构造函数(或上例中的make_shared【参考方案2】:

试试(用labda代替free函数):

mThread=make_shared<std::thread>([this]() Step(); ); 

事实上,尽管它是一个成员函数,但您并没有将 this 的引用传递给构造函数。

此解决方案使用 lambda 创建一个不带参数但具有对 this 的引用的函数对象。

如果您想使用全局函数,请执行此操作,并将 void Step() 移至使用前:

mThread=make_shared<std::thread>(::Step()); 

:: 消除了函数范围内的歧义。

【讨论】:

::Step() 不起作用,抱歉。 lambda 解决方案可以。谢谢! Step() 是一个成员函数,只是我忘了在其声明中包含 A::。现在它被编辑了。我很抱歉。【参考方案3】:

你应该用shared_from_this()替换这个

【讨论】:

您能否提供一个更完整的建议示例?

以上是关于使用 make_shared<std::thread> 创建 shared_ptr<std::thread> 的实例的主要内容,如果未能解决你的问题,请参考以下文章

使用 make_shared<std::thread> 创建 shared_ptr<std::thread> 的实例

使用 boost::make_shared 创建矢量元素无法正常工作

将 make_shared 与可变参数模板绑定

为啥在使用静态 constexpr 成员构造时 std::make_shared 与 new 不同? [复制]

C++ 复制指针所指向的对象 make_shared shard_ptr

C++ 中 make_shared 和普通 shared_ptr 的区别