如何使用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));

这没有任何意义。您正在绑定(不需要使用 bindthis 指针,但 &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 上阻塞实际线程)。