- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
寻找要使用的示例代码 tbb::concurrent_hash_map<K,V>
来自英特尔线程构建模块 (TBB)。
我可以插入,但我似乎无法读回值。
official Intel documentation示例代码方面似乎有些欠缺。
最好的文档在 Voss 的“Pro TBB:C++ Parallel Programming with Threading Building Blocks”中。 Download this book for free (这是公共(public)领域)。
忽略英特尔文档。它们本质上是函数签名的集合。
最佳答案
https://github.com/intel/tbb
为了安装 TBB,我使用了 vcpkg与 Linux
兼容, Windows
和 Mac
.是的,vcpkg 来自微软,但它是 100% 跨平台、开源的,而且非常受欢迎。
Linux:
./vcpkg search tbb # Find the package.
./vcpkg install tbb:x64-linux # Install the package.
window :
vcpkg search tbb # Find the package.
vcpkg install tbb:x64-windows # Install the package.
编译:
CMake
对于 gcc
.也可以下载源代码并将头文件和库提取到源代码树中,这同样有效。
代码。
#include "tbb/concurrent_hash_map.h" // For concurrent hash map.
tbb::concurrent_hash_map<int, string> dict;
typedef tbb::concurrent_hash_map<int, string>::accessor dictAccessor; // See notes on accessor below.
print(" - Insert key, method 1:\n");
dict.insert({1,"k1"});
print(" - 1: k1\n");
print(" - Insert key, method 2:\n");
dict.emplace(2,"k2");
print(" - 2: k2\n");
string result;
{
print(" - Read an existing key:\n");
dictAccessor accessor;
const auto isFound = dict.find(accessor, 2);
// The accessor functions as:
// (a) a fine-grained per-key lock (released when it goes out of scope).
// (b) a method to read the value.
// (c) a method to insert or update the value.
if (isFound == true) {
print(" - {}: {}\n", accessor->first, accessor->second);
}
}
{
print(" - Atomically insert or update a key:\n");
dictAccessor accessor;
const auto itemIsNew = dict.insert(accessor, 4);
// The accessor functions as:
// (a) a fine-grained per-key lock (released when it goes out of scope).
// (b) a method to read the value.
// (c) a method to insert or update the value.
if (itemIsNew == true) {
print(" - Insert.\n");
accessor->second = "k4";
}
else {
print(" - Update.\n");
accessor->second = accessor->second + "+update";
}
print(" - {}: {}\n", accessor->first, accessor->second);
}
{
print(" - Atomically insert or update a key:\n");
dictAccessor accessor;
const auto itemIsNew = dict.insert(accessor, 4);
// The accessor functions as:
// (a) a fine-grained per-key lock which is released when it goes out of scope.
// (b) a method to read the value.
// (c) a method to insert or update the value.
if (itemIsNew == true) {
print(" - Insert.\n");
accessor->second = "k4";
}
else {
print(" - Update.\n");
accessor->second = accessor->second + "+update";
}
print(" - {}: {}\n", accessor->first, accessor->second);
}
{
print(" - Read the final state of the key:\n");
dictAccessor accessor;
const auto isFound = dict.find(accessor, 4);
print(" - {}: {}\n", accessor->first, accessor->second);
}
打印使用{fmtlib}用于打印;可以替换为cout <<
.
输出:
- Insert key, method 1:
- 1: k1
- Insert key, method 2:
- 2: k2
- Read an existing key:
- 2: k2
- Atomically insert or update a key:
- Insert.
- 4: k4
- Atomically insert or update a key:
- Update.
- 4: k4+update
- Read the final state of the key:
- 4: k4+update
std::unordered_map
.这具有更标准的 API,并且在许多情况下是线程安全的,请参阅:unordered_map thread safety .如果可能,建议使用它,因为它具有更简单的 API。concurrent_unordered_map
来自英特尔 TBB。它本质上是同一件事,一个键/值映射。但是,它要老得多,级别低得多,而且更难使用。必须提供散列器、相等运算符和分配器。任何地方都没有示例代码,即使在官方英特尔文档中也是如此。尽管偶尔尝试了几个月,但我从来没有让它工作过。它可能已过时,因为该免费书籍中未提及它(它仅涵盖 concurrent_hash_map
)。不推荐。accessor其实有两种,一种是读锁,一种是写锁:
const_accessor
accessor
如果使用 find
, 使用 const_accessor
这是一个读锁。如果使用 insert
或 erase
, 使用 accessor
这是一个写锁(即它将等到任何读取完成,并阻止进一步的读取直到完成)。
这实际上等同于 reader/writer lock ,但在字典中的单个字典键上,而不是整个字典。
学习曲线的最后一部分:对于键写入,在访问器超出范围之前什么都不会发生。因此,任何锁都不会超过几条机器指令,可能使用 CAS(比较和交换)。
将此与数据库进行比较,访问器的范围就像一个事务。当访问器超出范围时,整个事务将提交到 HashMap 。
上面提到的免费书籍在关于 concurrent_hash_map
的章节中有很棒的性能技巧。 .
此 HashMap 的 API 功能强大但有些笨拙。但是,它支持插入/更新时的细粒度、按键锁定。使用 CAS 仅针对少数机器指令持有任何锁.这是其他任何语言的 HashMap 都无法提供的。建议以 std::unordered_map
开头为简单起见;它是 thread safe as long as the two threads do not write to the same key .如果需要极快的性能,可以选择重构,或者使用 []
在顶部编写兼容的包装器。访问器和 insert_or_update()
.
关于c++ - tbb:concurrent_hash_map<K,V>:英特尔线程构建模块 (TBB) 的示例代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60586122/
我有一个 k*n矩阵 X 和 k*k矩阵A。对于X的每一列,我想计算标量 X[:, i].T.dot(A).dot(X[:, i]) (或者,数学上, Xi' * A * Xi )。 目前,我有一个
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我是 VueJS 的新手。我已经使用 vuetify/webpack-ssr 模板创建了一个项目,现在我想创建一个登录页面,但是没有显示表单,控制台给了我以下信息: [Vue warn]: Unkno
我尝试将 value 插入到 C++ vector v 之前的第 i 元素(或元素 (i-1) 之后) )。代码很简单 v.insert(v.begin() + i, value); 我确信当 i 介
我需要显示使用合并排序算法排序的 vector 。然而,当我使用 v.begin() 时,我的 friend 使用 v.data() 来传递 vector 。他的代码运行良好,而我的却不行。请解释。
这是我的命令(url1、url2、url3、url4 是占位符): ffmpeg -i url1 -i url2 -i url3 -i url4 -filter_complex “[1:v:0] [1
我以前用过Vue,我知道怎么用v-for渲染元素序列,v-if或v-show有条件地显示元素,并且 v-model例如,控制段落的内容。 但现在我需要对 DOM 进行更精细的控制: 我有一个range
我正在学习所有权和借用。 borrow1 和borrow2 的区别在于在borrow2 打印时使用了&: fn borrow1(v: &Vec) { println!("{}", &v[10]
我找不到一种方法来选择不同的选项来渲染 v-for 中的文本。是否有可能或者我是否需要以不同的方式构建逻辑来执行类似于下面的代码的操作? // i
Iterable 的三个直接子类型是 Map , Seq , 和 Set .除了性能问题之外,似乎还有一个 Seq是从整数到值的映射,以及 Set是从值到 bool 值的映射(如果值在集合中,则为 t
我想应用一个计算方法,如果键存在则增加值,否则将 1。有 Map map = new HashMap<>(); 我不明白为什么 for (int i = 0; i v != null ? v++ :
标准(IEEE 754/C)是否保证以下代码断言永远不会失败? int main() { for ( /* all possible float / double values */ )
代码由Vue语言编写,使用Element-ui框架, 如果一个对象包含某些内容,则会显示该内容,如果不包含则禁用菜单按钮。 输出应该是这样的: a、b(禁用)、c、d、e 但我的是这样的: a、a(禁
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
如果我这样做: {{ morevalue }} {{ value }} v-else 中的跨度也会在第二个 V-FOR 上循环,即使它上面没有任何 v-for,为什么? 这是
我将 Vue.js 与 Vuetify 一起使用,我正在尝试使用 v-data-table 从后端加载菜单列表并使用 对其设置一些权限v-switches 但我在尝试 v-model 数组时遇到问题:
我在 Java 的流式操作中努力维护我想要的数据结构,这很可能是由于缺乏正确的理解和实践。 public class Main { public static void main(String
我正在尝试为匹配中的每个匹配呈现一些 HTML,但是,我不太确定 实际上是正确的。 更具体地说,我不确定我是否可以使用 v-bind:match='match'在与循环相同的元素上 v-for='ma
所以我想知道为什么这个 v-if 和 v-else 语句不起作用,为什么我要以不同的方式解决它。 代码如下 Required: Select a Workflow {{ isChain ?
我有一个 VueJS 组件 ,我在同一个模板中使用了两次来显示两组不同的数据。每个都显示在自己的 使用 v-if 切换的容器在导航选项卡上。 似乎这些组件被实例化为同一个实例。我调用 console
我是一名优秀的程序员,十分优秀!