私の質問はスレッドの使用法についてです。TCP/IPを介してデバイスに接続するアプリケーションを作成しています。boost ::asiolibを使用しています。デバイスへのリスニングと書き込みには、それぞれ読み取りスレッドまたはリスニングスレッドと書き込みスレッドを使用することにしました。私の混乱は、通信を処理するソケットを作成する関数もスレッドである必要があるということです。ありがとう :)
2 に答える
クライアントクラスでは、複数のサーバーへの複数の接続に使用されるメッセージの送受信を処理する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つのスレッドが必要になりますが、デバイスとの間の両方のストリームが相互に関係している場合(おそらくそれらが行うこと)に備えて、これらを適切に同期する必要があります。ただし、デバイスとの通信は、接続の確立、要求の送信、応答の待機と読み取り、別の要求の送信、次の応答の待機と読み取りなどのタスクのように聞こえます。この場合、1つのスレッドのみを使用します。十分であり、あなたの生活をずっと楽にしてくれます。