私は自分のプロジェクト用にマルチスレッドサーバーを構築しています。
条件変数とロックを使用しています。
グローバル変数として条件変数cvを持ち、クラスメンバーとしてmutex _mtxReceivedMessagesを持っています。condition_variableが待機しているときに閉じるときにC++プログラムがクラッシュするのを止めるには?
これは、ユーザーのメッセージを待つ関数です。
void Server::handleReceivedMessages()
{
while (1)
{
std::unique_lock<std::mutex> lck(_mtxReceivedMessages);
while (_queRcvMessages.size() == 0) cv.wait(lck); // As long as there are 0 messages in the queue
}
}
これはCV通知を呼び出す関数です:
void Server::addReceivedMessage(ReceivedMessage* msg)
{
_queRcvMessages.push(msg); // Adds the message to the queue
cv.notify_all(); // Unlockes all locked functions
}
問題は、私がしようとした場合閉鎖するということですプログラムは、(addReceivedMessage関数が呼び出される前に)関数handleReceivedMessagesが待機している間に、プログラムがクラッシュすると、
が削除されますが、行を削除した場合:
while (_queRcvMessages.size() == 0) cv.wait(lck); // As long as there are 0 messages in the queue
プログラムはうまく終了します。
プログラムがクラッシュします。Nuvola.exeの0x7748507C(ntdll.dll)で未処理の例外が発生しました:0xC000000D:無効なパラメータがサービスまたは関数に渡されました。
何が問題なのですか?
:(。それは1を持っている場合は、
join
に、サーバのスレッドが必要な場合があります)あなた
handleReceivedMessages
機能は、より多くのようになります。 – VTTブロッキングキューから物事を取り出すスレッドを止める私の好きな方法は、スレッドのメインループがその既知のアドレスか特殊な内容のどちらかで認識する識別オブジェクトです。スレッドは、キューからポップする各オブジェクトを調べ、ポイズンピルオブジェクトを見ると、クリーンアップと終了を知っています。 –