【发布时间】:2016-08-27 17:40:53
【问题描述】:
我想使用无锁队列编写多线程安全记录器。记录线程将消息推送到队列,记录器将弹出它们并发送到输出。我考虑如何解决这个问题——发送到输出。 我想尽可能避免使用互斥锁/锁。 因此,假设我将使用 C++ 流写入文件/控制台。我们可以假设目标系统是 Linux。
好的,写入流必须只是 Unix write 提供的系统调用的包装器(也许是高级包装器)。据我所知,系统调用是原子的(只有一个进程可以同时执行系统调用)。因此,不使用锁来安全地写入文件是很诱人的。
但是write 是一个系统调用,但它不能保证写入“整个输出”。它返回成功写入文件的字节数。
基本上,我的问题是: 如何解决?是否可以避免互斥锁? (我认为这是不可能的)。并请注明我的考虑,我错了吗?
【问题讨论】:
-
我不确定我是否完全理解问题的本质。你认为你在和谁竞争? “相互”排斥的前提是至少存在两方试图共享资源——你关心的第二方是谁?
-
有两个线程竞争直播。
-
好吧,你有这个精心设置的队列,明确的目的是只有一个线程实际执行 I/O。那你为什么要通过引入更多线程写入同一个文件来破坏你自己的设计呢?拥有那个队列有什么意义,如果你继续往文件中写入是免费的?
-
但是为什么呢?这似乎完全违背了练习的重点。让一个线程完成对文件的所有写入:问题已解决。
-
让我直说。您从一个问题开始:多个线程需要写入单个日志文件。为了解决这个问题,你引入了一个队列——所有线程都将它们的消息放入其中,然后一些东西会弹出它们并将它们写出来。然后你说 - 我想要多个线程来做这个弹出和写入。于是你又回到了你开始的地方——你有多个线程想要写入同一个文件。你离你的目标还差一步。如果有某种神奇的方式来协调这组新线程,您可以使用相同的方式来协调原始线程。
标签: c++ multithreading unix logging lock-free