首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有必要锁定读取对象吗?

有必要锁定读取对象吗?
EN

Stack Overflow用户
提问于 2021-07-21 14:25:04
回答 1查看 150关注 0票数 0

我正在编写一个具有共享字符串“队列”的程序:

  • 2或3个线程推送回队列,
  • UI线程每0.5秒从队列中弹出字符串。(UI线程意味着CWnd::OnTimer)

其中一个写入线程非常频繁地向后推字符串。(实际上,字符串是一个日志,每秒生成5-10行。)

我在上面添加了关于解释的代码片段。

代码语言:javascript
复制
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()的情况下没有问题,但在日志记录频率增加的情况下不确定。

请帮我做个决定。

EN

回答 1

Stack Overflow用户

发布于 2021-07-21 14:29:48

是。读者必须锁定以避免与读相关的未排序的写入,这将导致未定义的行为。

研究非阻塞队列数据结构可能有好处。我认为,多位作者必须锁定,但读者可以免费等待。但请记住,免费等待并不一定意味着有效。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68471304

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档