gpt4 book ai didi

c++ - 并行容器 - 同步元素删除

转载 作者:行者123 更新时间:2023-11-30 04:31:26 27 4
gpt4 key购买 nike

我在我的程序中成功地使用了 Concurrency::concurrent_unordered_map(这是 Microsoft 的实现)。这是必需的,因为元素的多次插入/更新和非常罕见的删除是以并发方式执行的。

我知道这个容器(像所有其他并发容器一样)提供了一个不安全的 erase() 方法 - 用于删除节点。

您认为使删除过程也是线程安全的最佳方法是什么?正如我所说的那样,这种情况很少发生(只是因为用户干预),而且我不希望每次在容器上执行搜索时都必须输入一个关键部分(或者任何其他操作,如迭代器)遍历和节点更新)。你怎么认为?我也在考虑一种基于事件的机制,但我看不出它在这里如何适用。

最佳答案

实际上,在我的案例中,关键部分的参与使删除过程并发安全完全违背了使用并发容器的目的。如果使用这种方法,则与并发容器相关的每个操作都必须由同一个锁保护(即,直到现在还不必互相踩脚的操作现在必须在同一个关键部分等待).因此,这是迄今为止最糟糕的想法,它会让您的并发容器在您可能使用它的任何情况下都变得无用。

解决上述不便的一个想法是使用 Reader Writer 锁。这允许共享读取但独占写入。应该使用写锁保护删除操作,并使用读锁保护 map 上的所有其他操作,如下所示:

    InsertOperation(key) -- this inserts the key in case is not present (and constructs a default constructed value)
{
reader_writer_lock::scoped_lock_read guard(reader_writer_lock);
...
}

value Find(key)
{
reader_writer_lock::scoped_lock_read guard(reader_writer_lock);
...
}

void EraseElement(key)
{
reader_writer_lock::**scoped_lock** guard(reader_writer_lock);
...
}

关于c++ - 并行容器 - 同步元素删除,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8173295/

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