首页 > 解决方案 > 我们可以验证 boostlog 核心确实删除了接收器吗?

问题描述

我正在使用 boost log 为我的程序制作日志记录系统。
我理解boost log机制是这样
的:核心单例寄存器sink,这导致sink的共享指针计数增加1,然后我们后端将这个计数增加到2,除了sink的共享指针的主计数为0。
在我的代码中,我从核心中删除了接收器,我希望这个前端接收器的共享指针计数减少到 1,然后我测试这个共享指针是唯一的,如果是,我重置共享指针。
我使用多线程并使用互斥锁来保护使用此特定接收器的 boost 日志代码“我有 cout 接收器,但我不保护它”问题是:有时我发现接收器前端共享指针计数器不是 2,它变成 3 .
我不知道为什么会发生这种情况,因为一旦计数为 1,每个接收器都会注册到核心,然后添加后端,我们应该只有 2 的计数。
有什么方法可以验证核心是否已移除前端接收器?
有没有办法知道共享指针的每个实例在代码中的位置?多谢

更新:
如果 core.remove_sink 在一个线程上执行,同时核心日志到 cout 是在另一个线程上完成的“cout sink 不受互斥锁保护”,我可以在控制台上看到 msg 写入错误的位置,其中某些消息在 core.remove_sink 应该完成之后,但是这里前端接收器共享指针计数没有减少!
核心是否丢弃了在登录到另一个接收器的同时出现的 remove_sink ???

标签: c++boost-log

解决方案


有什么方法可以验证核心是否已移除前端接收器?

返回时水槽被视为已移除remove_sink。也就是说,它不会收到任何未来的日志记录。

那时库可能不会释放它,因为在remove_sink调用时可能有日志记录正在进行中,并且remove_sink可能在这些日志记录被完全处理之前返回。日志记录处理将继续并可能涉及正在移除的接收器。最终,当所有日志记录都被处理并remove_sink返回时,sink 将被核心释放,如果没有更多的引用,则销毁。

您可以使用 来检测水槽何时不再存在weak_ptr,您可以通过shared_ptr引用水槽来构造它。当最后一个shared_ptr引用 sink 对象被销毁或重置时,该weak_ptr::lock方法将返回 null shared_ptr。请注意,这包括shared_ptr您可能在代码中持有的接收器的任何 s。

有没有办法知道共享指针的每个实例在代码中的位置?

一般来说,没有。您将不得不手动跟踪您传递的位置并保存指向对象的指针。


推荐阅读