[英]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::bind
和std::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.