如何使用std :: thread?

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?我怎样才能创建最初暂停的线程?

Jam*_*son 6

如何使用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在运行实际线程之前阻塞)。


zne*_*eak 5

如果希望线程独立运行,则需要detach()在对象上使用该方法.否则,thread如果在线程仍在运行时销毁对象,则析构函数将终止程序.

线程一旦创建就开始运行.您无法在挂起状态下创建线程对象.您可以存储参数以创建线程而不是实际创建它(例如,可能使用std::function),或者使其在互斥锁或条件变量上阻塞,直到您准备好让它运行为止.