如何使用std::thread?
How to use std::thread?
当我这样使用std::thread
时:
func()
{
std::thread(std::bind(&foo, this));
}
线程对象在堆栈中分配,并在func()
returns时被销毁。
所以我尝试像这样使用它:
func()
{
std::thread* threadPtr = new std::thread(std::bind(&foo, this));
}
我应该delete threadPtr
在哪里?
以及如何创建一个最初挂起的线程?
如果想让线程运行独立,需要在对象上使用detach()
方法。否则,如果对象在线程仍在 运行ning 时被销毁,thread
析构函数将终止您的程序。
线程一创建就开始 运行ning。您不能创建处于挂起状态的线程对象。您可以存储创建线程的参数而不是实际创建它(例如,可能使用 std::function
),或者使其阻塞在互斥锁或条件变量上,直到您准备好让它 运行.
How to use std::thread?
这取决于您在线程中执行的操作,但很可能您会想要使用 join
。也可以使用 detach
,但必须注意确保它不使用任何可能在执行时被破坏的资源。
std::thread(std::bind(&foo, this));
这没有任何意义。您正在绑定(不需要使用 bind
)this
指针,但 &foo
不是指向成员函数的指针(看起来像 &Foo::foo
)。假设您打算使用指向成员函数的指针,这意味着 func
也是同一 class 的成员函数(即,因为它可以访问 this
指针),因此以下代码为您提供了一个示例,说明您 可以做的事情 .
示例代码
#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
Where should I delete threadPtr?
我不会动态分配线程,但是在上面的示例代码中你会在加入后删除它。
how can I create a thread that is initially suspended?
C++ 不直接支持这一点,但您可以通过 std::thread::native_handle
使用平台特定的 API。 注意,如果您只想在一开始就阻塞一次,您可以使用同步原语来实现(例如,在 运行 之前的 std::mutex
上阻塞实际线程)。
当我这样使用std::thread
时:
func()
{
std::thread(std::bind(&foo, this));
}
线程对象在堆栈中分配,并在func()
returns时被销毁。
所以我尝试像这样使用它:
func()
{
std::thread* threadPtr = new std::thread(std::bind(&foo, this));
}
我应该delete threadPtr
在哪里?
以及如何创建一个最初挂起的线程?
如果想让线程运行独立,需要在对象上使用detach()
方法。否则,如果对象在线程仍在 运行ning 时被销毁,thread
析构函数将终止您的程序。
线程一创建就开始 运行ning。您不能创建处于挂起状态的线程对象。您可以存储创建线程的参数而不是实际创建它(例如,可能使用 std::function
),或者使其阻塞在互斥锁或条件变量上,直到您准备好让它 运行.
How to use std::thread?
这取决于您在线程中执行的操作,但很可能您会想要使用 join
。也可以使用 detach
,但必须注意确保它不使用任何可能在执行时被破坏的资源。
std::thread(std::bind(&foo, this));
这没有任何意义。您正在绑定(不需要使用 bind
)this
指针,但 &foo
不是指向成员函数的指针(看起来像 &Foo::foo
)。假设您打算使用指向成员函数的指针,这意味着 func
也是同一 class 的成员函数(即,因为它可以访问 this
指针),因此以下代码为您提供了一个示例,说明您 可以做的事情 .
示例代码
#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
Where should I delete threadPtr?
我不会动态分配线程,但是在上面的示例代码中你会在加入后删除它。
how can I create a thread that is initially suspended?
C++ 不直接支持这一点,但您可以通过 std::thread::native_handle
使用平台特定的 API。 注意,如果您只想在一开始就阻塞一次,您可以使用同步原语来实现(例如,在 运行 之前的 std::mutex
上阻塞实际线程)。