C++ 如何使用std::thread?
当我像这样使用C++ 如何使用std::thread?,c++,multithreading,stdthread,C++,Multithreading,Stdthread,当我像这样使用std::thread时: func() { std::thread(std::bind(&foo, this)); } 线程对象在堆栈中分配,并在func()返回时销毁。 所以我试着像这样使用它: func() { std::thread* threadPtr = new std::thread(std::bind(&foo, this)); } 我应该在哪里删除threadPtr? 如何创建初始挂起的线程?如果希望线程独立运行,则需要对对象使用d
std::thread
时:
func()
{
std::thread(std::bind(&foo, this));
}
线程对象在堆栈中分配,并在func()
返回时销毁。
所以我试着像这样使用它:
func()
{
std::thread* threadPtr = new std::thread(std::bind(&foo, this));
}
我应该在哪里删除threadPtr
?
如何创建初始挂起的线程?如果希望线程独立运行,则需要对对象使用
detach()
方法。否则,如果对象在线程仍在运行时被销毁,则线程
析构函数将终止程序
线程一创建就开始运行。不能在挂起状态下创建线程对象。您可以存储参数来创建线程,而不是实际创建线程(可能使用,例如,std::function
),或者将其阻塞在互斥体或条件变量上,直到您准备让它运行为止
如何使用std::thread
这取决于您在线程中执行的操作,但很可能您希望使用join
。也可以使用detach
,但必须小心确保它不会使用在执行时可能被破坏的任何资源
std::thread(std::bind(&foo,this))
这没有任何意义。您正在绑定(不需要使用bind
)此指针,但&foo
不是指向成员函数的指针(看起来像&foo::foo
)。假设您打算使用指向成员函数的指针,这意味着func
也是同一类的成员函数(即,因为它可以访问this
指针),因此下面的代码为您提供了一个可以执行的示例
示例代码
我应该在哪里删除threadPtr
我不会动态分配线程,但在上面的示例代码中,您将在加入后删除它
如何创建初始挂起的线程
C++不直接支持这一点,但您可以将特定于平台的API与std::thread::native_handle
一起使用注意,如果您想在一开始就阻塞一次,您可以使用同步原语(例如,在运行实际线程之前在std::mutex上阻塞)。“我应该在哪里删除threadPtr?”这取决于您,但是你没有一个句柄可以在函数内部以外的任何地方删除它。你到底想做什么?如果您告诉我们您试图解决的具体问题,我们可能会给您提供更好的建议。因此代码应该是auto-threadObj=std::thread(std::bind(&foo,this));threadObj.Detach()
?@Zach取决于线程正在执行的操作Detach
可能不合适(例如,如果它在线程仍在执行时访问已销毁的对象的资源)。@Zach他们指的是@James Adkison,谢谢<代码>分离()
是我想要的。
#include <iostream>
#include <thread>
class Foo
{
public:
Foo() = default;
~Foo()
{
if (mThread.joinable())
{
mThread.join();
}
}
void foo()
{
std::cout << "Foo::foo\n";
}
void func()
{
if (mThread.joinable())
{
mThread.join();
}
// Creates the thread without using 'std::bind'
mThread = std::thread(&Foo::foo, this);
}
private:
std::thread mThread;
};
int main()
{
{
Foo f;
f.func();
f.func();
}
return 0;
}
Foo::foo
Foo::foo