我们可以验证 boostlog 核心确实删除了接收器吗?

can we verify that boostlog core did remove sink?

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

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

is there any way I can verify that core has removed front end sink?

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

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

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

is there any way to know where each instance of shared pointer is present in code?

一般不会。您将必须手动跟踪您经过的位置并保存指向对象的指针。