【发布时间】:2020-10-01 17:51:47
【问题描述】:
我正在使用 boost log 为我的程序制作日志系统。
我理解这样的提升日志机制:
核心单例寄存器sink,这导致sink的共享指针计数增加1,然后我们后端将此计数增加到2,除了sink的共享指针的主计数为0。
在我的代码中,我从核心中删除了接收器,我希望这个前端接收器的共享指针计数减少到 1,然后我测试这个共享指针是唯一的,如果是,我重置共享指针。
我使用多线程并使用互斥锁来保护使用此特定接收器的 boost 日志代码“我有 cout 接收器,但我不保护它”
问题是:有时我发现 sink 前端共享指针计数器不是 2,而是 3。
我不知道为什么会发生这种情况,因为每个接收器都会在其计数为 1 时注册到核心,然后添加后端我们应该只有 2 的计数。
有什么方法可以验证核心是否已移除前端接收器??
有没有办法知道共享指针的每个实例在代码中的位置?
非常感谢
更新:
如果 core.remove_sink 在一个线程上执行,同时核心日志到 cout 是在另一个线程上完成的“cout sink 不受互斥锁保护”,我可以在控制台上看到味精写在错误的位置,其中某些消息在核心之后.remove_sink 应该完成,但是这里前端接收器共享指针计数没有减少!!
核心是否丢弃了在登录到另一个接收器时同时出现的 remove_sink ???
【问题讨论】: