我的问题是关于线程的使用。我正在创建一个通过TCP / IP连接到设备的应用程序。我正在使用boost :: asio lib。我决定分别使用读取或侦听线程和写入线程来监听和写入设备。我的困惑是创建处理通信的套接字的函数也应该是一个线程。 谢谢:))
答案 0 :(得分:2)
在我的客户端类中,我创建了2个工作线程来处理发送和接收消息,这些消息用于多个服务器的多个连接。创建这两个工作线程的线程恰好是用户界面线程。这就是我的代码:
// Create the resolver and query objects to resolve the host name in serverPath to an ip address.
boost::asio::ip::tcp::resolver resolver(*IOService);
boost::asio::ip::tcp::resolver::query query(serverPath, port);
boost::asio::ip::tcp::resolver::iterator EndpointIterator = resolver.resolve(query);
// Set up an SSL context.
boost::asio::ssl::context ctx(*IOService, boost::asio::ssl::context::tlsv1_client);
// Specify to not verify the server certificiate right now.
ctx.set_verify_mode(boost::asio::ssl::context::verify_none);
// Init the socket object used to initially communicate with the server.
pSocket = new boost::asio::ssl::stream<boost::asio::ip::tcp::socket>(*IOService, ctx);
//
// The thread we are on now, is most likely the user interface thread. Create a thread to handle all incoming socket work messages.
if (!RcvThreadCreated)
{
WorkerThreads.create_thread(boost::bind(&SSLSocket::RcvWorkerThread, this));
RcvThreadCreated = true;
WorkerThreads.create_thread(boost::bind(&SSLSocket::SendWorkerThread, this));
}
// Try to connect to the server. Note - add timeout logic at some point.
boost::asio::async_connect(pSocket->lowest_layer(), EndpointIterator,
boost::bind(&SSLSocket::HandleConnect, this, boost::asio::placeholders::error));
工作线程处理所有套接字I / O.这取决于您正在做什么,但是需要从另一个线程创建用于服务套接字的2个工作线程。如果你想要的话,其他线程可以是用户界面线程或主线程,因为它会很快返回。如果您有多个与服务器或客户端的连接,那么您需要决定是否需要多组线程来为它们提供服务。
答案 1 :(得分:0)
这取决于您是否想要同时读写。在这种情况下,您需要一个用于读取的线程和一个用于写入的线程,但是如果两个流与设备之间的流与彼此有关(它们可能做什么),则必须正确地同步这些线程。然而,与设备通话听起来像是一个任务,你建立一个连接,发送一些请求,等待和阅读答案,发送另一个请求,等待和阅读下一个答案,等等。在这种情况下,只使用一个线程足以让你的生活更轻松。