c++ - 完成生产者消费者队列后,如何通过交换指针来避免条件成本?

标签 c++ multithreading pointers

我有一个以 tbb::concurrent_queue 作为成员字段的记录器类。使用记录器对象的线程调用一个方法将消息推送到这个内部队列。记录器有一个内部线程,它正在使用这些消息,直到它收到一个哨兵消息,然后这个内部线程退出。问题是,如果此记录器对象的客户端尝试将更多消息记录到此记录器中(在对关闭的调用已发送哨兵之后),消息将传递到队列中,但不会在另一端拾取并静默丢失。理想情况下,我想在这种情况下发出通知,但在退出时使用内部消费者线程设置的标志来检查每次我即将将新消息推送到队列中时,这会增加对我来说是关键路径的分支成本.

我听到的一个想法是,也许消费者线程..就在退出之前..以某种方式原子地换出队列的指针,以便下一次调用它会调用其他可以现在以不同方式处理消息的东西..

即调用:m_buffer->push(message) 其中 m_buffer 是指向 tbb::concurrent_queue 的指针,在消费者线程完成后应该仍然看起来像 m_buffer->push(message) 除了它去其他地方..我的自定义处理程序左右...

我该怎么做呢?我不能将 m_buffer 交换为指向任何其他自定义类,除非我从 tbb::concurrent_queue 继承...是否有另一种方法来解决这个问题?

谢谢

最佳答案

对我来说听起来更像是一个设计问题。记录器的客户想要什么?记录消息。他们不关心它是进入队列,还是写到屏幕上,或者写到一张纸上,插入玻璃瓶中然后扔进海里。

所以你的记录器只需要公开一个log() 方法,没有别的。队列交换将在内部发生,方法是将两个队列保存在一个数组中并自动切换指针或索引。

此外,如果您的日志记录代码的速度很关键,那么您可能做的太多了...

关于c++ - 完成生产者消费者队列后,如何通过交换指针来避免条件成本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8458627/

相关文章:

C++ 帮助 STL - sort() 函数

c++ - 堆叠 switch 语句 c++

c++ - 一些内存似乎在 malloc() 和 free() 之后分配

c++ - 这是如何运作的?

java - 无锁队列中的这些行不是必需的吗?

c++ - 原始指针管理

c++ - 在 C++11 中,如何不向线程传递参数?

Python:多处理的非常奇怪的行为;后面的代码导致前面代码的 "retroactive"减速

c - 如何在c中打印指针?

c++ - 处理基类子对象的表达式的动态类型