使用shared_ptr启动std :: thread

Ale*_*xey 4 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();     
}
Run Code Online (Sandbox Code Playgroud)

Sla*_*ica 9

你使问题复杂化,只是传递std::shared_ptr自己,std::bindstd::thread知道如何处理它:

std::thread myThread( &Foo::operator(), foo_ptr );  
Run Code Online (Sandbox Code Playgroud)

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


typ*_*232 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();
}
Run Code Online (Sandbox Code Playgroud)

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

Foo foo;
std::thread th1(&Foo::moo, &foo);
std::thread th2([&]{ foo.moo(); });
Run Code Online (Sandbox Code Playgroud)