gpt4 book ai didi

c++ - 在 C++ 类中运行线程

转载 作者:行者123 更新时间:2023-11-30 04:00:55 25 4
gpt4 key购买 nike

我想创建一个有自己运行线程的类。我有以下代码来测试启动一个新线程。

class SingletonClass
{
public:
SingletonClass();
virtual ~SingletonClass(){};

static SingletonClass& Instance();
void DoSomething();
private:
static void MyThread(std::string data);

std::thread m_thread;
};

SingletonClass::SingletonClass()
{
m_thread = std::thread(MyThread, "test");
}

void SingletonClass::MyThread(std::string data)
{
while(1)
{
std::cout<<data<<std::endl;
}
}

void SingletonClass::DoSomething()
{
std::cout<<"Hello"<<std::endl;
}

SingletonClass& SingletonClass::Instance()
{
static SingletonClass _instance;
return _instance;
}


int _tmain(int argc, _TCHAR* argv[])
{
SingletonClass& singleton = SingletonClass::Instance();
singleton.DoSomething();

return 0;
}

当我运行我的程序时,线程函数被调用,然后程序因这个错误而崩溃:

enter image description here

为什么会这样?只要类被实例化,我怎样才能让线程继续运行

编辑

我已将线程对象添加为私有(private)变量,并在构造函数中将其启动。它现在不会崩溃。

最佳答案

这就是 std::thread 的析构函数所做的(§30.3.1.3 [thread.thread.destr]):

~thread();

If joinable(), calls std::terminate(). Otherwise, has no effects. [ Note: Either implicitly detaching or joining a joinable() thread in its destructor could result in difficult to debug correctness (for detach) or performance (for join) bugs encountered only when an exception is raised. Thus the programmer must ensure that the destructor is never executed while the thread is still joinable. —end note ]

SingletonClass 构造函数中创建的本地 thread 在该构造函数退出时被销毁,导致 terminate() 被调用(这反过来默认调用 abort()

一个可能的解决方法是让thread成为Singleton类的成员,并在Singleton<的析构函数中join(很明显,如果你这样做,你需要一些方法来通知线程退出)。或者,您可以考虑在 Singleton 的构造函数中使用 detach() 线程。

关于c++ - 在 C++ 类中运行线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26041109/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com