gpt4 book ai didi

c++ - 如何在条件变量等待时关闭时阻止 C++ 程序崩溃?

转载 作者:太空宇宙 更新时间:2023-11-04 15:59:46 25 4
gpt4 key购买 nike

我正在为我的项目构建一个多线程服务器。
我正在使用条件变量和锁。
我将条件变量 cv 作为全局变量,并将互斥体 _mtxReceivedMessages 作为类成员。

这是等待用户消息的函数:

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
}

问题是,如果我在函数 handleReceivedMessages 等待时(在调用函数 addReceivedMessage 之前)尝试关闭程序,程序就会崩溃,
但如果我删除该行:

 while (_queRcvMessages.size() == 0) cv.wait(lck); // As long as there are 0 messages in the queue

程序正常退出。

程序崩溃:Nuvola.exe 中 0x7748507C (ntdll.dll) 处出现未处理的异常:0xC000000D:传递给服务或函数的参数无效。

可能是什么问题?

最佳答案

如果你想干净关闭,你需要把它设计到所有东西中。您的服务器需要一个关闭函数(可以是它的析构函数)。您的 handleReceivedMessages 函数需要一种在关机时停止的方法。

例如,您可以将 bool shutdown; 添加到您的 Server 类。要关闭类,获取互斥锁,将 shutdown 设置为 true,并向条件变量发出信号。 (您可能需要加入服务器的线程,如果它有的话。)

您的 handleReceivedMessages 函数看起来更像这样:

void Server::handleReceivedMessages()
{
while (1)
{
std::unique_lock<std::mutex> lck(_mtxReceivedMessages);
while (!shutdown && _queRcvMessages.size() == 0) cv.wait(lck); // As long as there are 0 messages in the queue
if (shutdown) return;
}
}

关于c++ - 如何在条件变量等待时关闭时阻止 C++ 程序崩溃?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47421064/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com