问题描述
我正在使用boost log为程序编写日志系统。
我了解这样的加速日志机制:
核心单例寄存器接收器,这导致接收器的共享指针计数增加1,然后我们除了将接收器的共享指针的主要计数设为0之外,还将后端的计数增加到2。
在我的代码中,我从核心删除了接收器,并希望该前端接收器的共享指针计数减少到1,然后测试该共享指针是否唯一,如果是,则重置共享指针。
我使用多线程并使用互斥锁来保护与此特定接收器一起使用的增强日志代码“我有cout接收器,但我不保护它”
问题是:有时我发现接收器前端共享指针计数器不是2,而是变为3。
我不知道为什么会这样,因为每个接收器一旦计数为1便会注册到核心,然后加上后端,我们应该只有2。
有什么方法可以验证核心是否已移除前端接收器?
有没有办法知道代码中存在共享指针的每个实例的位置?
非常感谢
更新:
如果在一个线程上执行core.remove_sink并且同时在另一个线程上完成了对cout的核心日志“ cout接收器不受互斥量保护”,并且我可以在控制台上看到味精写在错误的位置,其中某些消息在核心之后.remove_sink应该完成,但是这里前端接收器共享指针的数量不会减少!
内核是否丢弃了在记录到另一个接收器的同时出现的remove_sink ??
解决方法
有什么方法可以验证核心是否已移除前端接收器?
当remove_sink
返回时,认为接收器已删除。也就是说,它将不再接收任何未来的日志记录。
此时库可能不会释放它,因为在remove_sink
调用时可能正在处理日志记录,并且remove_sink
可能在完全处理这些日志记录之前返回。日志记录处理将继续,并且可能涉及要删除的接收器。最终,在处理完所有日志记录并返回remove_sink
时,接收器将被内核释放,并且如果没有更多引用,则将销毁该接收器。
您可以使用weak_ptr
来检测何时不再存在接收器,您可以从shared_ptr
引用接收器来构造它。当最后一个引用接收器对象的shared_ptr
被销毁或重置时,weak_ptr::lock
方法将返回空的shared_ptr
。请注意,这包括您可能在代码中持有的接收器中的所有shared_ptr
。
有没有办法知道代码中存在共享指针的每个实例?
通常,不会。您将必须手动跟踪传递的位置并保存指向对象的指针。