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

时间:2018-01-22 18:18:06

标签: c++ multithreading c++11 pthreads stdthread

我试图做这样的事情:

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:错误:'class std :: result_of'中没有名为'type'的类型          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 ...&GT)            ^ ~~~~~~~~   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 个答案:

答案 0 :(得分: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错误。

相关问题