我需要知道是否有一种方法可以“排队”等待条件变量的线程,以便它们以正确的顺序被唤醒……也就是说,无需编写一堆排队代码。
在大多数系统中,生产者/消费者模型的以下反转(在满邮箱上阻塞)可能无法确保排序:
unique_lock lock1(mutex), lock2(mutex)
ConditionVariable cv
代码块 A:(被多个线程调用)
lock(lock1)
timestampOnEntry = now()
cv.wait(lock1) // Don't worry about spurious notifies, out of scope.
somethingRequiringMonotonicOrderOfTimestamps(timestampOnEntry)
unlock(lock1)
代码块 B:(由单个线程调用,通常在循环内)
lock(lock2)
somethingVeryVerySlow()
(1) unlock(lock2) // the ordering here is not a mistake
(2) cv.notify_one(lock2) // prevents needless reblocking in code block A
请注意,第 (1) 行和第 (2) 行按给定顺序排列。如果通知的线程在代码块 B中的线程解锁保护之前唤醒,这可以防止代码块 A中不必要的第二个保护块。
问题是,如果多个线程在等待时被“阻塞” ,我需要知道 *notify_one* 是否会按照阻塞的顺序唤醒它们。可能不是(如在 Java 中)。如果不是默认情况下,如果有办法指定。
这当然可以用一堆排队代码来完成,但我更喜欢使用预先罐装的 BOOST 方法,不管罐头的内容有多复杂。当然,如果我将 *cv.notify_one(guard)* 转换为 *cv.notify_all(guard)*,无论如何我都需要执行排队代码。