【发布时间】:2017-11-21 19:23:10
【问题描述】:
我正在为我的项目构建一个多线程服务器。
我正在使用条件变量和锁。
我将条件变量 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:向服务或函数传递了无效参数。
可能是什么问题?
【问题讨论】:
-
推送消息时需要同步。
-
我最喜欢的停止从阻塞队列中获取东西的线程的方法是给它一个毒丸——一个线程的主循环通过其已知地址或特殊地址识别的杰出对象内容。线程查看它从队列中弹出的每个对象,当它看到毒丸对象时,它知道清理并退出。
标签: c++ multithreading mutex condition-variable