Zac*_*ach 0 c++ multithreading stdthread
当我这样使用时std::thread:
func()
{
std::thread(std::bind(&foo, this));
}
Run Code Online (Sandbox Code Playgroud)
线程对象在堆栈中分配,并在func()返回时被销毁.所以我尝试使用它:
func()
{
std::thread* threadPtr = new std::thread(std::bind(&foo, this));
}
Run Code Online (Sandbox Code Playgroud)
我应该在哪儿delete threadPtr?我怎样才能创建最初暂停的线程?
如何使用std::线程?
这取决于您在线程中执行的操作,但很可能您会想要使用join. 也可以使用detach,但必须小心确保它不使用任何在执行时可能被破坏的资源。
std::thread(std::bind(&foo, this));
这没有任何意义。您正在绑定(bind不必要使用)this指针,但&foo不是指向成员函数的指针(看起来像&Foo::foo)。假设您打算使用指向成员函数的指针,这意味着它func也是同一类的成员函数(即,因为它可以访问该指针),因此以下代码为您提供了一个可以执行的操作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;
}
Run Code Online (Sandbox Code Playgroud)
Foo::foo
Foo::foo
Run Code Online (Sandbox Code Playgroud)
我应该在哪里删除threadPtr?
我不会动态分配线程,但在上面的示例代码中,您将在加入后删除它。
如何创建一个最初挂起的线程?
C++ 不直接支持这一点,但您可以将平台特定的 API 与std::thread::native_handle. 注意,如果您想在一开始就阻塞一次,您可以使用同步原语来实现这一点(例如,std::mutex在运行实际线程之前阻塞)。
如果希望线程独立运行,则需要detach()在对象上使用该方法.否则,thread如果在线程仍在运行时销毁对象,则析构函数将终止程序.
线程一旦创建就开始运行.您无法在挂起状态下创建线程对象.您可以存储参数以创建线程而不是实际创建它(例如,可能使用std::function),或者使其在互斥锁或条件变量上阻塞,直到您准备好让它运行为止.
| 归档时间: |
|
| 查看次数: |
5992 次 |
| 最近记录: |