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

4

Consider the following code:

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'”。 很明显我做了一些愚蠢的事情,但我想不出来是什么问题。 有人能帮忙吗? 提前致谢!

3个回答

8

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指出的那样,std::thread的构造函数对成员函数指针有特殊处理,并假定接下来的第一个参数是调用成员函数的实例的指针或引用。这意味着您可以避免使用bind,直接将this作为第二个参数传递。

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

现场!编译器告诉我(“未解决的函数”),但我就是看不到它,我完全被蒙住了(我应该回家了……)。另外,根据你指出的,在声明Test为静态的情况下也可以。但是你的解决方案在我的情况下更实用,因为它避免了传递指向所有者对象的指针。谢谢! - DrD
1
你可以直接将成员指针和对象指针传递给 std::thread 构造函数(以及 std::bindstd::async):mThread = std::make_shared<std::thread>(&A::Step, this); - Casey
非常感谢你,Casey,这是一个更加优雅的解决方案 :) - DrD
@Casey 我们如何传递一个或多个参数的函数?假设函数step有一个“函数指针”作为参数,那么语法会是什么样子? - Vatsal Aggarwal
@VatsalAggarwal 将额外的参数传递给thread的构造函数(或上面示例中的make_shared)。 - Praetorian

1
尝试使用lambda代替自由函数:
mThread=make_shared<std::thread>([this](){ Step(); }); 

目前的情况是,尽管它是一个成员函数,但您没有将对此的引用传递给构造函数。
这个解决方案使用lambda创建一个函数对象,该函数对象不带参数,但具有对此的引用。
如果您想使用全局函数,可以这样做,然后将void Step()移到其使用之前。
mThread=make_shared<std::thread>(::Step()); 

::可以消除函数作用域的歧义。


Step()不起作用,抱歉。Lambda解决方案可以。谢谢! - DrD
Step()是一个成员函数,只是我忘记在它的声明中包含A::。现在已经被编辑过了。对此我深表歉意。 - DrD

0

你应该使用 shared_from_this() 替换 this


你能提供一个更完整的例子吗? - rsilva4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接