首页 文章

将回调函数中对象的引用传递给std :: thread [duplicate]

提问于
浏览
0

这个问题在这里已有答案:

我正在尝试做这样的事情:

void commands_conn_handler(int socket, RPiServer& server) {
  // Not important code about handling connection
}

class RPiServer {
public:
  void Accept(void Accept(void (*acceped_conn_handler)(int, RPiServer&)) {
    // (...)
    int remote_socket = 0; // Doesn't matter - example.
    std::thread conn_handler_thread(acceped_conn_handler, remote_socket, *this);
    conn_handler_thread.join();
  }
};

int main() {
  RPiServer commands_server();
  commands_server.Accept(commands_conn_handler);
}

当我尝试构建它时,有一些错误:

在/ usr / include / c / 6 / thread:39:0中包含的文件,来自src / rpi_server / rpiserver.cpp:11:/ usr / include / c / 6 / functional:在'struct std ::的实例化中_Bind_simple':/ usr / include / c / 6 / thread:138:26:'std :: thread :: thread(Callable &&, Args && ...)[with _Callable = void(*&)(int,RPiServer&) ; _Args = {int&,RPiServer&}]'src / rpi_server / rpiserver.cpp:89:79:从这里需要/ usr / include / c / 6 / functional:1365:61:错误:'类中没有名为'type'的类型std :: result_of'typedef typename result_of <Callable( Args ...)> :: type result_type; ^ ~~~~~~~~~~ / usr / include / c / 6 / functional:1386:9:错误:'class std :: result_of'中没有名为'type'的类型_M_invoke(_Index_tuple <_Indices ... >)^ ~~~~~~~~ Makefile:29:目标'build / rpi_server / rpiserver.o'的配方失败

当我以下列方式更改线程函数时(删除对象的引用):

void commands_conn_handler(int socket) {
  // Not important code about handling connection
}

class RPiServer {
public:
  void Accept(void (*acceped_conn_handler)(int)) {
    // (...)
    int remote_socket = 0; // Doesn't matter - example.
    std::thread conn_handler_thread(acceped_conn_handler, remote_socket);
    conn_handler_thread.join();
  }
};

int main() {
  RPiServer commands_server();
  commands_server.Accept(commands_conn_handler);
}

一切都很完美 . 当我将参考作为参数传递给线程函数时,我做错了什么?

1 回答

  • 2

    所以这里有一个有效的例子:

    #include <thread>
    #include <functional>
    class RPiServer;
    
    void commands_conn_handler(int socket, RPiServer &server) {
        // Not important code about handling connection
    }
    
    class RPiServer {
    public:
        void Accept(void (*acceped_conn_handler)(int, RPiServer&)) {
            // (...)
            int remote_socket = 0; // Doesn't matter - example.
            std::thread conn_handler_thread(acceped_conn_handler, remote_socket, std::ref(*this));
            conn_handler_thread.join();
        }
    };
    
    int main() {
        RPiServer commands_server;
        commands_server.Accept(commands_conn_handler);
    }
    

    您得到的错误是因为您没有为 conn_handler_thread 的构造函数提供正确的类型 . 要显式获取对象的引用(您需要在此处执行),请使用std::ref()函数 .

    P.S . :还复制粘贴你的代码示例错误,复制 void Accept 部分 . 您在 main() 中也有most vexing parse错误 .

相关问题