作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个基于 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
。我的目标是将 ref/pointer 传递给它(或将来可能添加的任何其他资源)并在 Server::onMessage
中接收它(作为附加参数)。
我完全不知道该怎么做。另外,我不想创建像 mongo::Client * Server::acquire()
/Server::release(mongo::Client *)
这样的分配器接口(interface),因为它需要额外的同步。我的意图是访问(如何?)Server::onMessage
处理程序中的某种每线程“用户数据”。
最佳答案
线程本地存储可能有效。
例如,使用一个struct
来保存您的 mongo 客户端:
struct ThreadData
{
mongo::Client client;
}
然后,声明一个线程局部的ThreadData
对象:
thread_local ThreadData data;
int main( int argc, char* argv[] )
{
Server server;
// estimated thread pool
std::vector<std::thread> threads;
threads.reserve(threadsCount);
for(int i = 0; i < threadsCount; ++i)
{
threads.emplace_back(
[&server]()
{
// 'data' is thread-local
data.client = mongo::Client(config);
server.run();
});
}
}
每个线程作为数据
的线程本地拷贝,因此您可以在Server::onMessage(...)
中访问它而无需进一步同步。
关于c++ - 如何将每线程用户数据传递给 asio 处理程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43695875/
我是一名优秀的程序员,十分优秀!