阅读boost :: asio的文档,我还不清楚何时需要使用asio :: strand.假设我有一个使用io_service的线程,那么可以安全地在套接字上写入如下吗?
void Connection::write(boost::shared_ptr<string> msg)
{
_io_service.post(boost::bind(&Connection::_do_write,this,msg));
}
void Connection::_do_write(boost::shared_ptr<string> msg)
{
if(_write_in_progress)
{
_msg_queue.push_back(msg);
}
else
{
_write_in_progress=true;
boost::asio::async_write(_socket, boost::asio::buffer(*(msg.get())),
boost::bind(&Connection::_handle_write,this,
boost::asio::placeholders::error));
}
}
void Connection::_handle_write(boost::system::error_code const &error)
{
if(!error)
{
if(!_msg_queue.empty())
{
boost::shared_ptr<string> msg=_msg_queue.front();
_msg_queue.pop_front();
boost::asio::async_write(_socket, boost::asio::buffer(*(msg.get())),
boost::bind(&Connection::_handle_write,this,
boost::asio::placeholders::error));
}
else
{
_write_in_progress=false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
多个线程调用Connection :: write(..)或者我必须使用asio :: strand吗?
我想使用具有多个线程的libev来处理tcp连接.我想要的是:
主线程侦听传入连接,接受连接并将连接转发到workerthread.
我有一堆workerthreads.线程数取决于cpu的数量.每个工作线程都有一个事件循环.工作线程监听我是否可以在tcp套接字上写入或者是否有可供阅读的东西.
我看着libev的文档,我知道这可以用libev做,但我找不到任何的例子,我怎么也得做.
有人有例子吗?我认为我必须使用ev_loop_new()api,对于worker-threads和主线程我必须使用ev_default_loop()?
问候
我想在C++中使用一个NIO框架,它可以处理至少100,000个并发连接。我正在考虑使用 boost::asio,但我不知道它在多核系统上是否能很好地扩展。有人有使用 boost:asio 和处理这么多连接的经验吗?