我写了一个网络记录器,它在单独的线程中工作。这个想法是允许应用程序推送任意数量的数据,并且记录器应该单独处理它而不减慢主线程的速度。伪代码如下所示:
void LogCoroutine::runLogic()
{
mBackgroundWorker = std::thread(&LogCoroutine::logic, this);
mBackgroundWorker.detach();
}
void LogCoroutine::logic()
{
while (true)
{
_serverLogic();
_senderLogic();
std::this_thread::sleep_for(std::chrono::milliseconds(10)); // 10ms
}
}
void LogCoroutine::_senderLogic()
{
std::lock_guard<std::mutex> lock(mMutex);
while (!mMessages.empty() && !mClients.empty())
{
std::string nextMessage = mMessages.front();
mMessages.pop_front();
_sendMessage(nextMessage);
}
}
_serverLogic
检查新连接(对等点)的套接字并_senderLogic
处理带有消息的队列并将其发送给所有连接的对等点。
最后一个功能:推送消息:
void LogCoroutine::pushMessage(const std::string& message)
{
std::lock_guard<std::mutex> lock(mMutex);
mMessages.push_back(message);
}
当包裹不经常发送时,一切正常。应用程序启动时有一个循环记录大量信息。并且应用程序挂起 5-10 秒,没有记录它不会变慢。
那么,这个架构的瓶颈在哪里呢?也许在里面推送带有互斥锁的每条消息是个坏主意?