尝试在std::thread中使用已删除的函数

Attempt to use a deleted function in std::thread

本文关键字:删除 函数 std thread      更新时间:2023-10-16

我的代码如下:

void internal_listener(TNReceiver *t){
    std::string oldVal = "";
    while (true) {
        void *holder = t+OFFSET;
        std::string val = *(std::string *)holder;
        if(val == oldVal){
        }else{
            time_t tine;
            std::cout << "[" << time(&tine) << "] : Logger msg recv: " << val;
        }
    }
}
TNReceiver::TNReceiver(int reg){
    this->REGISTER_ID = reg;
}
void TNReceiver::register_to_net(TNNet *net){
    net->add_transceiver(new TNData(this->REGISTER_ID, ""));
}
void TNReceiver::start_listen(){
    std::thread listen{this};
    listen.join();
}

我该如何解决这个问题?错误位于std::thread listen{this}。我不想传递TNReceiver的"副本"。任何解决方案都很棒!

如果您试图复制构造线程,您将收到一个错误,因为复制构造函数已被删除。然而,您可以移动构造一个线程:

thread t1(f); 
thread t2 {std::move(t1)};   // move construct.  
t2.join(); 

在线演示

但是,活动线程不再附加到初始对象。在您的代码中,这可能会带来一些问题,因为显然构建新线程的对象本身就是一个线程,然后这可能会打破您的一些假设。

注意:您的意图并不完全清楚,因为您创建一个线程只是为了在之后立即加入它。如果你添加了更多关于你的意图的信息,TNReceiver发布了一条评论,我会更新