我有一个基于 websocketpp(基于 ASIO)的服务器和一个线程池。我需要分配一些资源(连接到数据库等),并确保它们将始终在同一个线程中完全使用。
所以,这是我目前拥有的:
class Server
: public websocketpp::server<websocketpp::config::asio>
{
Server();
//...
static void onMessage(Server * server,
websocketpp::connection_hdl hdl,
Server::message_ptr msg);
//...
};
Server::Server()
{
// ...some initialization routines.. //
set_message_handler(
std::bind(&onMessage,
this,
std::placeholders::_1,
std::placeholders::_2));
listen(port);
start_accept();
}
在main()
函数的某个地方:
Server server;
// estimated thread pool
std::vector<std::thread> threads;
threads.reserve(threadsCount);
for(int i = 0; i < threadsCount; ++i)
{
threads.emplace_back(
[&server]()
{
mongo::Client mongo(config); // !HERE!
server.run();
});
}
如您所见mongo::Client
,每个线程都有一个实例化。我的目标是将引用/指针传递给它(或将来可能添加的任何其他资源)并接收它Server::onMessage
(作为附加参数)。
我完全不知道如何做到这一点。另外,我不想创建像mongo::Client * Server::acquire()
/这样的分配器接口Server::release(mongo::Client *)
,因为它需要额外的同步。我的意图是访问(如何?)处理程序中的某种每线程“用户数据” Server::onMessage
。