gpt4 book ai didi

c++ - 有没有一种安全的方法可以让 std::thread 作为类的成员?

转载 作者:IT老高 更新时间:2023-10-28 22:58:54 25 4
gpt4 key购买 nike

我想使用一个管理一个线程(或多个线程)的类。使用合成,这看起来像:

class MyClass{
private:
std::thread mythread;
void _ThreadMain();
public:
MyClass();
// other fields
}

因为 std::thread 的默认构造函数没有意义,我需要在 MyClass 构造函数中显式调用它:

MyClass::MyClass() : mythread(&MyClass::_ThreadMain,this) {}

但是,在这种情况下,_ThreadMain 方法可能会在 MyClass 构造之前执行,从而导致任何奇怪的行为。这显然是不安全的。我该如何解决这个问题?

一个明显的解决方案是使用指向 std::thread 的指针,并添加另一个成员函数:

void MyClass::Start(){
// This time mythread is of type std::thread*
mythread = new std::thread(&MyClass::_ThreadMain,this); // One could use std::unique_pointer instead.
}

这将启动该线程。在这种情况下,它会在类构建完成后调用,这确实是安全的。

但是,我想知道是否有任何合理的解决方案可以让我不为此使用指针。感觉应该是有可能的(嘿,在构造类时必须有一种方法来启动线程!),但我想不出任何不会造成麻烦的东西。

我考虑过使用条件变量,以便 _ThreadMain 等到构造函数完成其工作,但在构造类之前我不能使用一个,对吗? (如果 MyClass 是派生类,这也无济于事)

最佳答案

您可以将线程与移动语义结合使用:

class MyClass final
{
private:
std::thread mythread;
void _ThreadMain();
public:
MyClass()
: mythread{} // default constructor
{
// move assignment
mythread = std::thread{&MyClass::_ThreadMain, this};
}
};

移动赋值运算符记录在下一页。特别是 noexcept 并且没有创建新线程。

关于c++ - 有没有一种安全的方法可以让 std::thread 作为类的成员?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23594244/

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