【问题标题】:can we verify that boostlog core did remove sink?我们可以验证 boostlog 核心确实删除了接收器吗?
【发布时间】: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 ???

【问题讨论】:

    标签: c++ boost-log


    【解决方案1】:

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

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

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

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

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

    一般来说,不会。您必须手动跟踪传递的位置并保存指向对象的指针。

    【讨论】:

    • 我在每次调用日志类时都设置了互斥锁,错误消失了。非常感谢
    猜你喜欢
    • 2016-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-17
    • 2015-06-16
    • 1970-01-01
    • 2015-09-23
    • 1970-01-01
    相关资源
    最近更新 更多