无锁容器如何响应并发分区和排序
How lockfree containers react to concurrent partitioning and sorting?
如何通过并发容器(例如在 boost 或 tbb 实现中)处理同时从 2 个不同线程执行的分区和排序等两种标准算法?
Boost 具有无锁队列和堆栈。人们不会对这些进行排序或分区。
在对文档的肤浅检查中,TBB 有 concurrent_hash_map 和队列类,其相同。
只有TBB的concurrent_vector
才会提出这个问题。文档对此描述如下:
concurrent_vector<T>
是可动态增长的T
数组
但是,只有存储(重新)分配是无锁线程安全的,而不是元素本身;
在清除数组之前,concurrent_vector从不移动元素,即使对于单线程代码,这也比 STL std::vector 更具优势
和
对concurrent_vector的操作对于增长是并发安全的,而不是用于清除或销毁向量。如果concurrent_vector上有其他操作正在进行,切勿调用方法 clear()。
因此,如果您想对concurrent_vector进行排序,您可能会
- 希望相互排除访问;如果延迟至关重要,则可以使用原子自旋锁而不是成熟的互斥锁,但无论如何都需要同步
- 想要考虑复制到排序范围,使源条目保持不变;这可以在不进一步锁定的情况下完成(假设对向量元素的读取操作是线程安全的),参见例如
std::partial_sort_copy
相关文章:
- 控制允许动态运行c++的并发操作数
- 节俭并发:未解决的外部问题
- 当服务中的事件被触发时,如何将响应从服务发送回客户端?
- 并发/多线程:是否可以以这种方式生成相同的输出?
- C++ 信号和插槽不工作:插槽不响应事件
- NodeJs 服务器充斥着 UDP 广播,不发送响应
- 用于在并发环境中访问 MMIO 的软件模式
- C++关于ENUM的问题。我得到的响应比枚举列表大
- C++中的并发哈希表
- 提升 asio 并发计时器取消问题与链
- 应用程序在打开的简历中捕获视频后没有响应
- C++具有基元类型的并发队列
- 使用 cpprest (Casablanca) 返回 PDF 响应
- 使用简单两相锁定的并发程序
- C++ 按引用或值推送的并发队列
- 为什么当通过 TCP 发送的消息速率增加时,请求-响应消息对的延迟会降低?
- 如何使用从处理程序调度的最终回调将响应异步返回给调用方on_read?
- 允许多个互斥锁所有者或指定数量的并发代码执行
- 获取加密的正文响应WinHttp HTTPS
- 无锁容器如何响应并发分区和排序