Pseudocode:
Function1_vector_copy () {
vectora = vectorb;
}
Function2_vector_search() {
find k in vectora;
}
该程序是多线程的。虽然可以搜索多个线程,但矢量复制仅由单个线程完成,但有时会发生。问题是无论如何,vector_search 不应该失败。Vector_copy 可以延迟,但 vector_search 不应该。它是一个没有延迟,没有失败的模式。问题是共享变量 vectora 必须是持久的,因此 vector_search 根本不会失败。实现这一目标的最佳方法是什么?
编辑 :
boost::shared_mutex _access;
Function1_vector_copy() {
// get upgradable access
boost::upgrade_lock lock(_access);
// get exclusive access
boost::upgrade_to_unique_lock uniqueLock(lock);
// now we have exclusive access
vectora.swap(vectorb);
}
Function2_vector_search() {
// get shared access
boost::shared_lock lock(_access);
// now we have shared access
find k in vectora ;
}
如果具有可升级所有权的线程尝试升级而其他线程具有共享所有权,则尝试将失败并且线程将阻塞,直到可以获得独占所有权。 --boost 文档
诀窍是矢量复制是异步完成的,它将在获得独占所有权后发生。所以向量复制最终会发生,但延迟了,实际上向量复制也是一个非失败操作,但延迟了,这对我来说没问题。会有一个锁以某种方式进行同步,我们将至少阻塞一毫秒。但是使用这种交换的优势将导致它的时间更短,可以忽略不计。