九仞之行 2020-02-14 16:55 采纳率: 0%
浏览 415

每次导入一个命名空间,空间内的变量便会初始化一次嘛?

如题,当有多个文件引入同一个命名空间时,命名空间内定义的变量会在每一次引入时都初始化嘛

问题由来:
我在调试程序的时候发现,本应该只初始化一次的变量初始化了两次。。
调试表现为输出两句初始化

图片说明

这有悖我的程序意愿
程序文件列表

类文件

|--RRCSer.h

|--RRCSer.cpp

主程序文件:

|--main.cpp
程序的打印功能是使用一个我自定义的类CLogger来实现的,我将它定义于命名空间中
static CLogger s_logger;//全局静态日志器

问题:

我想要实现每次只有一个线程在打印消息,其他线程等待上一线程打印完毕再继续打印,我选择用互斥对象(定义为CLogger的成员变量)来实现这个功能。可调试过程中发现本应该只初始化一次的互斥对象,初始化了两次,实际调试窗口中,两个互斥对象的地址也不一样,导致主线程与子线程输出冲突(我暂时使用主线程先休眠一段时间的方法解决了这个问题)
问题输出:
图片说明

进一步的调试,发现s_logger 对象被创建了两次,也就是说主线程与子线程用的两个互斥对象。。。导致两线程共同输出消息时的冲突。我的s_logger定义于RRCSer.h头文件里的命名空间中,并且这个命名空间被main.cpp和RRCSer.cpp引入,从而得出以上问题,再问问有什么推荐的方法可以解决这个问题

大致的代码如下(只提供出现问题的代码):

RRCSer.h:

namespace Ser
{
    class CLogger
    {
    public:
        CLogger();
        ~CTestCLogger();
    private:
        HANDLE m_mutex
    };
    static CLogger s_logger;

}

RRCSer.cpp

#include <RRCSer.h>
using namespace Ser;
    CLogger::CLogger()
    {
    }

    CLogger::~CLogger()
    {
    }

main.cpp

#include "RRCSer.cpp"
using namespace Ser;
int main()
{
    return 0;
}
  • 写回答

1条回答 默认 最新

  • 你知我知皆知 2024-07-25 21:31
    关注

    以下回答参考 皆我百晓生券券喵儿 等免费微信小程序相关内容作答,并由本人整理回复。

    要解决这个问题,你需要确保在每个线程中都有唯一的互斥对象。你可以通过以下方式实现这一点:

    1. 使用互斥锁(mutex)来控制对共享资源的访问。
    2. 在每个线程中创建一个新的互斥锁。

    以下是修改后的 RRCSer.cpp 文件中的示例代码:

    #include <mutex>
    
    namespace Ser
    {
        class CLogger
        {
        public:
            CLogger() : m_mutex(std::make_unique<std::mutex>()) {}
            ~CLogger() {}
    
        private:
            std::unique_ptr<std::mutex> m_mutex;
        };
    
        static CLogger& GetLogger()
        {
            static CLogger s_logger;
            return s_logger;
        }
    }
    

    这样做的好处在于,每个线程都会有一个独立的互斥锁,即使在同一时刻有两个线程尝试获取锁,它们也会因为互相竞争而失败。同时,由于互斥锁的使用,你可以在不中断任何正在进行的任务的情况下,让新线程进入主线程循环开始的条件语句。

    评论

报告相同问题?

悬赏问题

  • ¥15 有两个非常“自以为是”烦人的问题急期待大家解决!
  • ¥30 STM32 INMP441无法读取数据
  • ¥15 R语言绘制密度图,一个密度曲线内fill不同颜色如何实现
  • ¥100 求汇川机器人IRCB300控制器和示教器同版本升级固件文件升级包
  • ¥15 用visualstudio2022创建vue项目后无法启动
  • ¥15 x趋于0时tanx-sinx极限可以拆开算吗
  • ¥15 pyqt信号槽连接写法
  • ¥500 把面具戴到人脸上,请大家贡献智慧,别用大模型回答,大模型的答案没啥用
  • ¥15 任意一个散点图自己下载其js脚本文件并做成独立的案例页面,不要作在线的,要离线状态。
  • ¥15 各位 帮我看看如何写代码,打出来的图形要和如下图呈现的一样,急