例如,如果我们不依赖于时间,那么我们可以使用数组或读取器线程和一个编写器线程来解决like this via shared_mutex and shared_lock这种情况。但是如果我们想要在certan时间框架内完成所有的写入操作,并且如果没有完成,则停止等待并开始在读取器线程内做其他事情。怎么办这样的事情?如何能够从一些观察者线程到所有读者线程说 - “嘿伙计们 - 在这个时间框架中,有来自作家的任何新数据,所以继续。”
答案 0 :(得分:3)
使用定时锁定。
boost::shared_mutex m
Reader()
shared_lock lock(m, timeout);
if(!lock) {
//I don't have the lock. Don't touch the resource and do something else.
}
else {
//I have the lock. Read now.
}
Writer()
upgrade_lock lck(m);
upgrade_to_unique_lock uniqueLock(lck);
只需选择超时值即可。请注意,它不一定精确。
顺便说一句:如果你打算使用Boost.Threads,也许你应该read the documentation。它非常广泛。我从来没有使用过Boost.Threads,我花了几秒钟就找到了它。答案 1 :(得分:1)
还有另一种解决问题的方法:查看Thread Pool模式。使用此模式,您可以将工作划分为可由工作线程池执行的单元。每当有事情要做时,你排队一个工作单元,池中的下一个可用线程将执行它。这可以确保线程总是忙于做某事(当有事情要做时)。
您需要了解线程安全producer-consumer queues才能实现此模式。