我正在为我的项目构建多线程服务器。
我正在使用条件变量和锁。
我将条件变量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,并用信号通知条件变量。 (如果服务器线程有一个,则可能需要join。)

您的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;
 }
}

07-28 01:03
查看更多