繁体   English   中英

使用shared_ptr启动std :: thread

[英]Launching std::thread using shared_ptr

构造新线程时,将提供的函数对象复制到属于新创建的线程的存储中。 我想在新线程中执行对象方法。 不应复制该对象。 所以我将对象的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();     
}

你过分复杂的问题,只需传递std::shared_ptr本身, std::bindstd::thread知道如何处理它:

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

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

草图代码中有很多错误。 我认为更可读的方法是使用一个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(); });

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM