当前位置: 首页 > 知识库问答 >
问题:

为什么std::barrier分配?

向嘉誉
2023-03-14

为什么std::barrier在堆上分配内存,而std::latch没有?

它们之间的主要区别是可以重用,而std::latch不能重用,但我找不到解释为什么前者会分配内存

共有1个答案

郭乐湛
2023-03-14

虽然可以使用恒定的存储量作为对象的一部分来实现简单的屏障,但实际的屏障实现使用的结构

作为“更好”实现的一个例子,gcc libstdc实现使用树屏障。这避免了所有线程共享的单个计数器/互斥锁上的争用,树屏障可以在对数时间内传播“屏障完成,释放时间”信号,但需要线性空间来表示线程树。

不难想象,增强的树型屏障实现能够了解缓存/套接字/内存总线层次结构,并根据其物理位置对树中的线程进行分组,从而将跨核、跨芯片和跨套接字轮询降至所需的最低限度。

另一方面,闩锁是一种更加轻量级的同步工具。然而,我不太清楚为什么闩锁会被禁止分配-cppreference状态,

闩锁类是类型为std::ptrdiff\u t的向下计数器

这表明它不应该分配(即,它只是一个计数器,没有空间容纳指向已分配对象的指针)。另一方面,标准中的[线程.锁存器]只说了“锁存器维护一个内部计数器,该计数器在创建锁存器时初始化”,而不禁止它进行分配。

 类似资料:
  • 在我的clang和libc版本中(靠近),这个传递: 当然,如果你真的试图复制构造一个唯一指针的向量,它无法编译: 我假设这种情况是因为

  • https://godbolt.org/z/P97MaK 我玩的概念和预期d::is_equality_comparable工作矢量,但它没有。 编译错误在 内部失败,而不是在受概念保护的函数边界处失败。 这是错误还是预期行为?

  • 我需要在向量中找到max元素,所以我使用了,但我发现它是一个非常慢的函数,所以我编写了自己的版本,并设法获得更好的x3性能,下面是代码: 输出: 平均而言,要比多花费x3个时间。那么为什么我能够这么容易地创建一个更快的std函数呢?既然std这么慢,我是不是应该停止使用std并编写自己的函数呢? 注意:一开始我以为这是因为我在for循环中使用了andinteger而不是迭代器,但现在看来这并不重要

  • 我知道了从< code>std::async返回的< code>future具有某种特殊共享状态的原因,通过这种状态,< code >等待返回的future发生在future的析构函数中。但是当我们使用< code>std::pakaged_task时,它的未来不会表现出同样的行为。要完成打包的任务,必须从< code>packaged_task显式调用< code>future对象上的< cod

  • 在过去的几个月里,我一直在学习C语言并使用终端。我的代码使用g和c11编译并运行得很好,但在过去几天里它开始出现错误,此后我在编译时遇到了问题。我唯一可以编译和运行的程序依赖于旧的C标准。 我第一次遇到的错误包括 尝试使用ecg$g-o stoi_试验stoi_试验编译。cpp-std=c 11 大堆cpp:13:22:错误:命名空间“std”中没有名为“stoi”的成员;你是说“阿托伊”吗?in