我正在编写一个具有共享字符串“队列”的程序:
其中一个写入线程非常频繁地向后推字符串。(实际上,字符串是一个日志,每秒生成5-10行。)
我在上面添加了关于解释的代码片段。
class Logger {
std::mutex m_mutex;
std::list<std::string> m_queLogs;
public:
int info(std::string zLog) {
std::lock_guard<std::mutex> lk(m_mutex);
m_queLogs.push_back(std::move(zLog));
...
}
std::string popLog() { //!!!!! Do I need to add a lock_guard here?
if (m_queLogs.size() == 0)
return "";
auto zLog = m_queLogs.front();
m_queLogs.pop_front();
return zLog;
}
}
// Thread 1
int TcpComm::OnRecv(int opCode, char* buf) {
switch (opCode) {
case CODE_LOG: // generated nearly Real-time
Logger::instance()->info(buf);
break;
...
}
...
}
// Thread 2
void MonitorThread(LPVOID lpvoid) {
while (1) {
Sleep(60 * 1000); // generated some times.
Logger::instance()->info(" ---- monitor signal --- ");
...
}
}
// UI Thread
void CLogView::OnTimer(UINT_PTR nIDEvent)
{
// every 500 milisecond.
auto zLog = Logger::instance()->popLog();
CString strLog = convert_utf8_to_cstring(zLog);
m_ctrLogView.AppendString(strLog);
}m_queLogs的字符串永远不会被移除,只会在写线程时向后推。
只有UI线程从m_queLogs弹出日志。
我认为在不锁定Logger::popLog()的情况下没有问题,但在日志记录频率增加的情况下不确定。
请帮我做个决定。
发布于 2021-07-21 14:29:48
是。读者必须锁定以避免与读相关的未排序的写入,这将导致未定义的行为。
研究非阻塞队列数据结构可能有好处。我认为,多位作者必须锁定,但读者可以免费等待。但请记住,免费等待并不一定意味着有效。
https://stackoverflow.com/questions/68471304
复制相似问题