问题描述
我正在尝试创建一个“guarded_thread”,但我收到错误“operator=' is a private member of 'std::__1::thread'。这是我的代码:
struct guarded_thread : std::thread{
using std::thread::thread;
using std::thread::operator=;
~guarded_thread(){if(joinable())join();}
};
void Guarded_thread(std::thread &Thread){
if (Thread.joinable()) {
Thread.join();
}
}
解决方法
std::thread
的析构函数不是虚拟的。因此,您将无法多态地使用您的 guarded_thread
,并且与使线程成为成员相比,继承的好处很小。 std::thread
不能被复制,这基本上就是错误所说的,所以 guarded_thread
也不能被复制。不过,它可以移动:
#include <thread>
#include <iostream>
struct guarded_thread {
std::thread t;
~guarded_thread() {
if(t.joinable()) {
t.join();
}
}
};
void foo(guarded_thread&& t) {}
int main() {
foo(guarded_thread{ std::thread{ [](){ std::cout << "hello world"; }}});
}
PS:std::thread
没有加入它的析构函数对很多人来说是一个惊喜,也许也是因为 C++20 引入了 std::jthread
。正如 Swift 在评论中指出的那样,std::jthread
的析构函数在加入线程之前也会 request_stop()
s,而当线程无限运行时,guarded_thread
会永远阻塞。