gpt4 book ai didi

c++ - vector 复制和多线程 : how to ensure multi-read even if occasional writes may happen?

转载 作者:搜寻专家 更新时间:2023-10-31 01:16:31 25 4
gpt4 key购买 nike

Pseudocode:
Function1_vector_copy () {
vectora = vectorb;
}
Function2_vector_search() {
find k in vectora;
}

程序是多线程的。虽然许多线程可能会搜索,但 vector 复制仅由单个线程完成,但偶尔会发生。不管问题是什么,vector_search 都不应该失败。 Vector_copy 可以推迟,但 vector_search 不应该。它是一种无延迟、无故障模式。问题是共享变量 vectora 必须是持久的,因此 vector_search 根本不会失败。实现这一目标的最佳方法是什么?

编辑:

Using an answer for another question

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 ;

}

If a thread with upgradable ownership tries to upgrade whilst other threads have shared ownership, the attempt will fail and the thread will block until exclusive ownership can be acquired. --boost-documentation

诀窍是 vector 复制是异步完成的,它会在获得独占所有权后发生。所以 vector 复制最终会发生但被推迟了,实际上 vector 复制也是一个非失败操作但延迟了这对我来说没问题。将以某种方式锁定同步,我们将至少阻塞一毫秒。但是使用这种交换的优势是可以缩短交换时间,使其可以忽略不计。

最佳答案

Function1_vector_copy () 
{
VectorType tmp = vectorb;

rwLock.acquireWrite();
swap(tmp,vectora);
rwLock.releaseWrite();
}

剩下的留给读者作为练习。

更新:总结以下评论...

首先要明确的是,原来的swap(...)上面的调用旨在作为伪代码,不一定要按字面意思理解。我不知道到底是什么 VectorType是(技术上仍然没有)。我假设您打算尽可能高效地执行 swap() 。毕竟是伪代码...

无论如何,std::swap()专用于 C++ 标准库中的所有容器类型。所以如果VectorType实际上是 std::vector<UDT> , 然后 swap(tmp,vectora);应该是最优的并且无需修改即可工作(依靠 Koenig 查找来解析符号)。

关于c++ - vector 复制和多线程 : how to ensure multi-read even if occasional writes may happen?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9059074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com