Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用std::thread?_C++_Multithreading_Stdthread - Fatal编程技术网

C++ 如何使用std::thread?

C++ 如何使用std::thread?,c++,multithreading,stdthread,C++,Multithreading,Stdthread,当我像这样使用std::thread时: func() { std::thread(std::bind(&foo, this)); } 线程对象在堆栈中分配,并在func()返回时销毁。 所以我试着像这样使用它: func() { std::thread* threadPtr = new std::thread(std::bind(&foo, this)); } 我应该在哪里删除threadPtr? 如何创建初始挂起的线程?如果希望线程独立运行,则需要对对象使用d

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

func()
{
   std::thread(std::bind(&foo, this));
}
线程对象在堆栈中分配,并在
func()
返回时销毁。 所以我试着像这样使用它:

func()
{
   std::thread* threadPtr = new std::thread(std::bind(&foo, this));
}
我应该在哪里
删除threadPtr

如何创建初始挂起的线程?

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

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

如何使用std::thread

这取决于您在线程中执行的操作,但很可能您希望使用
join
。也可以使用
detach
,但必须小心确保它不会使用在执行时可能被破坏的任何资源

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

这没有任何意义。您正在绑定(不需要使用
bind
)此
指针,但
&foo
不是指向成员函数的指针(看起来像
&foo::foo
)。假设您打算使用指向成员函数的指针,这意味着
func
也是同一类的成员函数(即,因为它可以访问
this
指针),因此下面的代码为您提供了一个可以执行的示例

示例代码
我应该在哪里删除threadPtr

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

如何创建初始挂起的线程


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

“我应该在哪里删除threadPtr?”这取决于您,但是你没有一个句柄可以在函数内部以外的任何地方删除它。你到底想做什么?如果您告诉我们您试图解决的具体问题,我们可能会给您提供更好的建议。因此代码应该是
auto-threadObj=std::thread(std::bind(&foo,this));threadObj.Detach()
?@Zach取决于线程正在执行的操作
Detach
可能不合适(例如,如果它在线程仍在执行时访问已销毁的对象的资源)。@Zach他们指的是@James Adkison,谢谢<代码>分离()
是我想要的。
#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