使用shared_ptr启动std :: thread

时间:2015-09-18 15:49:22

标签: c++ multithreading c++11

构造新线程时,将提供的函数对象复制到属于新创建的线程的存储中。我想在新线程中执行对象方法。不应复制该对象。所以我将对象的shared_ptr传递给std::thread构造函数。如何使用std::shared_ptr()对象启动新线程?例如

class Foo {
public: 
    void operator()() {       
        // do something
    }    
};

int main() {
    std::shared_ptr<Foo> foo_ptr(new Foo);

    // I want to launch a foo_ptr() in a new thread
    // Is this the correct way?
    std::thread myThread(&Foo::operator(), foo_ptr.get());  
    myThread.join();     
}

2 个答案:

答案 0 :(得分:9)

您使问题过于复杂,只需通过std::shared_ptr本身,std::bindstd::thread知道如何处理它:

std::thread myThread( &Foo::operator(), foo_ptr );  

这种方式std::thread实例将共享所有权,这将保证在myThread之前不会销毁对象

答案 1 :(得分:5)

草图代码中有很多错误。我认为更可读的方法是使用一个lambda来捕获sptr的值,然后用它来对它调用函数。

#include <thread>
#include <memory>
#include <cstdio>

class Foo
{
public:
    void operator()()
    {
        printf("do something\n");
    }
};

int main()
{
    auto foo_ptr = std::make_shared<Foo>();

    std::thread myThread([foo_ptr] { (*foo_ptr)(); });
    myThread.join();
}

你想做什么并不是很清楚。如果要在不复制类实例的情况下启动运行成员函数的新线程,则语法将是其中之一:

Foo foo;
std::thread th1(&Foo::moo, &foo);
std::thread th2([&]{ foo.moo(); });