受保护的线程 C++

问题描述

我正在尝试创建一个“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"; }}});
}

Live Demo

PS:std::thread 没有加入它的析构函数对很多人来说是一个惊喜,也许也是因为 C++20 引入了 std::jthread。正如 Swift 在评论中指出的那样,std::jthread 的析构函数在加入线程之前也会 request_stop() s,而当线程无限运行时,guarded_thread 会永远阻塞。