如何使用 std::thread?

Posted

技术标签:

【中文标题】如何使用 std::thread?【英文标题】:How to use std::thread? 【发布时间】:2015-04-23 05:12:08 【问题描述】:

当我像这样使用std::thread 时:

func()

   std::thread(std::bind(&foo, this));

线程对象在堆栈中分配,并在func() 返回时被销毁。 所以我尝试像这样使用它:

func()

   std::thread* threadPtr = new std::thread(std::bind(&foo, this));

我应该在哪里delete threadPtr? 以及如何创建一个最初被挂起的线程?

【问题讨论】:

"我应该在哪里删除 threadPtr?" 这取决于你,但你没有句柄可以在函数内部以外的任何地方删除它。 您实际上想要完成什么?如果您告诉我们您要解决的具体问题,我们或许可以为您提供更好的建议。 【参考方案1】:

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

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

【讨论】:

所以代码应该是auto threadObj = std::thread(std::bind(&foo, this)); threadObj.Detach()? @Zach 取决于您的线程正在做什么,detach 可能不合适(例如,如果它访问在线程仍在执行时被销毁的对象的资源)。 @Zach 他们指的是std::thread::detach @James Adkison,谢谢。 detach() 是我想要的。【参考方案2】:

如何使用std::thread?

这取决于您在线程中所做的事情,但很可能您会想要使用join。也可以使用detach,但必须注意确保它不使用任何可能在执行时被破坏的资源。

std::thread(std::bind(&foo, this));

这没有任何意义。您正在绑定(不需要使用 bindthis 指针,但 &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;

示例输出

Foo::foo
Foo::foo

我应该在哪里删除 threadPtr?

我不会动态分配线程,但在上面的示例代码中你会在加入后删除它。

如何创建一个最初被挂起的线程?

C++ 不直接支持此功能,但您可以通过std::thread::native_handle 使用特定于平台的 API。 注意,如果您只想在一开始就阻塞一次,您可以使用同步原语来实现这一点(例如,在运行实际线程之前阻塞 std::mutex)。

【讨论】:

以上是关于如何使用 std::thread?的主要内容,如果未能解决你的问题,请参考以下文章

如何放弃或取消 std::thread

如何使用一个 std::thread 对象来运行 2 个顺序事件(函数)?

如何使用 QThread 创建一个分离的线程,就像在 std::thread 中一样

如何在 Qt 的主事件循环中使用 std::thread?

std::thread 中的参数。如何运作?

如何使用 std::thread C++ 生成多个调用相同函数的线程 [关闭]