【发布时间】:2014-01-06 16:01:52
【问题描述】:
我想实现一个快速记录器,它保存日志条目,当某个触发器到达时,它会刷新最后 X 条消息。
所以想法是将所有消息保存在一个循环缓冲区中,一旦我们有了触发器,就将它的 ID 推送到另一个线程监控的队列(所有系统中的一个线程)。该线程将返回 X 消息并刷新它们。我知道如何处理在我尝试刷新时正在写入的消息、在我刷新之前已被覆盖的消息、在我尝试更新它们时被刷新的消息等。
我的问题是,例如,如果我有 20 个线程写入消息,并且只有 10 个内核,那么在 2 个“写入器”线程执行之间的时间差内,所有缓冲区将被多次覆盖。
有什么方法可以让“我的”线程“强制”“作者”线程执行(或者给它时间片?我猜没有,但仍然...... 你能建议任何其他方式/设计来克服这个问题吗?
【问题讨论】:
-
视情况而定,但同时有多个线程写入硬盘驱动器会使硬盘驱动器的速度在 CPU 处理速度饱和之前很久。为简单起见,我只有 1 个写线程:-/。在任何一种情况下,互斥锁或文件锁都有助于确保只有 1 个 (fifo) 线程可以访问缓冲区或写入位置。
-
@MadScienceDreams:是的,我有一位作家(相应地更新了问题)。但问题仍然存在,缓冲区在写入者有机会刷新之前被覆盖
-
你可以给那个线程一个更高的优先级,所以一旦它发出信号(通过条件变量、互斥体、信号量、读写锁,无论你想要什么),系统调度程序都会执行它线。请注意,您的问题可以通过更好的设计得到更好的解决。如果您的缓冲区在您无法控制的情况下被覆盖,那么您需要重新考虑您的日志记录机制。
-
@Shahbaz:是的,考虑过,不幸的是,这不是一个选项。
标签: c++ multithreading