C++ asio 提供线程的异步执行
Posted
技术标签:
【中文标题】C++ asio 提供线程的异步执行【英文标题】:C++ asio provide async execution of thread 【发布时间】:2016-10-15 12:32:05 【问题描述】:我有一个简单的服务器应用程序。当新客户端连接时,它处理来自客户端的请求并将数据发送回它。我的问题是提供句柄线程的异步执行。现在,当开始一个句柄线程时,它会停止接受器循环并等待相应函数的返回。 问题是启动一个句柄线程后如何组织acceptor循环的延续(能够同时处理其他连接)?
服务器.h:
class Server
private:
//Storage
boost::asio::io_service service;
boost::asio::ip::tcp::acceptor* acceptor;
boost::mutex mtx;
//Methods
void acceptorLoop();
void HandleRequest(boost::asio::ip::tcp::socket* clientSock);
public:
Server();
;
服务器.cpp
void Server::acceptorLoop()
std::cout << "Waiting for clients..." << std::endl;
while (TRUE)
boost::asio::ip::tcp::socket clientSock (service);
acceptor->accept(clientSock); //new socket accepted
std::cout << "New client joined! ";
boost::thread request_thread (&Server::HandleRequest, this, &clientSock); //create a thread
request_thread.join(); //here I start thread, but I want to continue acceptor loop and not wait until function return.
void Server::HandleRequest(boost::asio::ip::tcp::socket* clientSock)
if (clientSock->available())
//Works with socket
Server::Server()
acceptor = new boost::asio::ip::tcp::acceptor(service, boost::asio::ip::tcp::endpoint(boost::asio::ip::tcp::v4(), 8001));
acceptorLoop(); //loop started
【问题讨论】:
将胎面保存在例如一个向量,不要在创建线程后立即加入。此外,您必须使用其他方式来处理clientSock
对象,因为现在您传递一个指向对象的指针,一旦循环迭代,该对象将超出范围(并被破坏)。
【参考方案1】:
这里有两个主要问题:
-
线程加入 - 在接受新连接之前您正在等待线程完成
使用 pointer 指向在 stack 上创建的套接字
我建议您进行以下更改:
boost::asio::ip::tcp::socket clientSock (service);
acceptor->accept(clientSock); //new socket accepted
std::cout << "New client joined! ";
std::threadstd::bind(&Server::HandleRequest, this, std::placeholders::_1), std::move(clientSock).detach();
而 HandleRequest 会变成这样:
void Server::HandleRequest(boost::asio::ip::tcp::socket&& clientSock)
if (clientSock.available())
//Works with socket
您也可以将线程存储在某处,稍后再加入而不是分离。
【讨论】:
【参考方案2】:那你为什么叫加入呢? join就是等待一个线程完成,而你说不想等待线程,所以,好吧……就不要调用join了?
【讨论】:
以上是关于C++ asio 提供线程的异步执行的主要内容,如果未能解决你的问题,请参考以下文章