这不是您问题的直接答案,但重新考虑您的并发模型可能会更好。锁是同步任何东西的糟糕方法——级别太低、容易出错等。尝试在消息传递并发方面重新考虑您的问题:
这里的想法是每个线程都是它自己的紧密包含的消息循环,每个线程都有一个用于发送和接收消息的“邮箱”——我们将使用 MailboxThread 一词来区分这些类型的对象和普通的简线程。
因此,不是让两个线程访问同一个缓冲区,而是让两个 MailboxThreads 在彼此之间发送和接收消息(伪代码):
let filter =
while true
let image = getNextMsg() // blocks until the next message is recieved
process image
let camera(filterMailbox) =
while true
let image = takePicture()
filterMailbox.SendMsg(image) // sends a message asyncronous
let filterMailbox = Mailbox.Start(filter)
let cameraMailbox = Mailbox.Start(camera(filterMailbox))
现在您正在处理的线程根本不知道或不关心任何缓冲区。他们只是等待消息并在消息可用时对其进行处理。如果您发送许多消息以供 filterMailbox 处理,则这些消息将排队等待稍后处理。
这里的难点实际上是实现您的 MailboxThread 对象。虽然它需要一些创造力才能做到正确,但完全有可能实现这些类型的对象,以便它们仅在处理消息时保持线程打开,并在没有消息要处理时将正在执行的线程释放回线程池(此实现允许您在没有悬空线程的情况下终止应用程序)。
这里的优点是线程如何发送和接收消息而不用担心锁定或同步。在幕后,您需要在消息入队或出队之间锁定消息队列,但该实现细节对您的客户端代码是完全透明的。