构造新线程时,将提供的函数对象复制到属于新创建的线程的存储中。我想在新线程中执行对象方法。不应复制该对象。所以我将对象的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();
}
答案 0 :(得分:9)
您使问题过于复杂,只需通过std::shared_ptr
本身,std::bind
和std::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(); });