make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚?

2024-05-16

前几天我偶然看到这个非常有趣的演示 http://channel9.msdn.com/Events/GoingNative/GoingNative-2012/STL11-Magic-Secrets作者:Stephan T. Lavavej,其中提到“我们知道你住哪里“优化(很抱歉在问题标题中使用了缩写词,所以警告我,否则问题可能已被关闭),并且作者:赫伯·萨特(Herb Sutter)关于机器架构的文章。

简而言之,“我们知道你住哪里“优化在于将引用计数器放置在与对象相同的内存块上make_shared正在创建,从而导致一个内存分配而不是两个并且使得shared_ptr更紧凑。

然而,在总结了我从上面两个演示中学到的知识后,我开始怀疑 WKWYL 优化是否不能降低性能以防万一shared_ptr被多个线程访问运行在不同的核心上.

如果参考计数器是close到内存中的实际对象,事实上,它们应该更有可能被提取到相同的缓存行作为对象本身。反过来,如果我正确地吸取了教训,那么线程在竞争同一缓存行时更有可能减慢速度,即使它们不需要这样做。

Suppose one线程数需要更新参考计数器多次(例如,复制时shared_ptr周围),同时其他的只需要访问指向的对象: 这不会减慢执行速度吗all线程通过让它们竞争相同的缓存线?

如果引用计数位于内存中的其他位置,我会说争用不太可能出现.

这是否是反对使用的一个很好的论据make_shared()在类似的情况下(当然,只要它实现了 WKWYL 优化)?还是我的推理有错误?


If这就是你的使用模式,那么当然,make_shared将导致“错误共享”,这是我所知道的使用相同缓存行的不同线程的名称,即使它们没有访问相同的字节。

对于其附近部分被不同线程(其中之一正在写入)使用的任何对象来说也是如此。在这种情况下,“对象”是由以下命令创建的组合块make_shared。你也可以问是否any如果不同线程或多或少同时使用邻近数据,则尝试从数据局部性中受益可能会适得其反。是的,它可以。

可以得出结论,如果每个对象的每个可写部分都分配在较远的位置,则不太可能出现争用。因此,通常修复错误共享的方法是将内容分散开(在这种情况下,您可以停止使用make_shared或者您可以将填充放入对象中,以将其各部分分隔到不同的缓存行中)。

与此相反,当不同的部件用于same线程,如果您将它们分散到内存中,那么就会产生成本,因为有更多内容需要提取到缓存中。由于分散事物有其自身的成本,因此这实际上可能不会像您首先想到的那样对很多应用程序有帮助。但毫无疑问,编写有帮助的代码是可能的。

有时的好处是make_shared与缓存行和局部性无关,只是它进行了一次动态分配而不是两次。它的值取决于您分配和释放的对象数量:它可能可以忽略不计;这可能是你的应用程序适合 RAM 与疯狂交换之间的区别;在某些情况下,您的应用程序可能需要进行所需的所有分配。

仅供参考,还有另一种情况可能不使用make_shared,那就是当对象不小并且弱指针的寿命明显超过shared_ptr。原因是控制块在弱指针消失之前不会被释放,因此如果您使用make_shared那么直到弱指针消失后,对象占用的全部内存才会被释放。当然,一旦共享指针被破坏,对象就会被破坏,所以重要的只是类的大小,而不是关联的资源。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

make_shared<>() 中的 WKWYL 优化是否会给某些多线程应用程序带来惩罚? 的相关文章

  • 您可以从基本 Win32 控制台模板应用程序中的 C#/Winrt 组件调用(不是 WinForm/abstractions/wrappers 或使用 C++/Winrt 模板)吗?)

    我有一个现有的程序 win32 x86 控制台应用程序 需要调用托管代码 来自 Net 的 C dll The dll不暴露给 COM 但可以从 C WinRT 组件调用并由 C WinRT 控制台模板应用引用 BUT即使安装了 C Win
  • 在 OnModelCreating 期间设置列名称

    Issue 我目前正在尝试通过设置的属性为我的表及其列添加前缀 我正在使用实体框架核心 我已经正确地为表名添加了前缀 但我似乎无法弄清楚列的前缀 我有一种感觉 我需要使用反射 我已经留下了我的 可能很糟糕的 反思尝试 有人有办法在实体中设置
  • C++ 长 switch 语句还是用地图查找?

    在我的 C 应用程序中 我有一些值充当代表其他值的代码 为了翻译代码 我一直在争论使用 switch 语句还是 stl 映射 开关看起来像这样 int code int value switch code case 1 value 10 b
  • 运行需要 MySql.Data 的内置 .NET 应用程序

    我在运行我编写的内置 NET 应用程序时遇到问题 我的应用程序使用最新的 MySql 连接器 该连接器安装在我的系统上 当我尝试将其添加为引用时 该连接器显示为 NET 4 Framwork 组件 当我在环境中以调试模式运行应用程序时 一切
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • C# 5 async/await 线程机制感觉不对?

    为什么让调用线程进入异步方法直到内部 等待 一旦调用异步方法就生成一个线程 这不是更干净吗 这样您就可以确定异步方法会立即返回 您不必担心在异步方法的早期阶段没有做任何昂贵的事情 我倾向于知道某个方法是否要在 我的 线程上执行代码 不管是堵
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 将表(行)与 OpenXML SDK 2.5 保持在一起

    我想在 Word 文档中生成多个表 每行 2 行 但我想将这两行保留在一起 如果可能的话 new KeepNext 第一行不起作用 new KeepNext 第一行的最后一段不起作用 new CantSplit 放在桌子上不起作用 在所有情
  • 访问 ascx 文件中的母版页控件

    我有一个母版页文件 其中包含 2 个面板控件中的 2 个菜单 我还使用控件来检查用户是否登录并获取用户类型 根据我想要显示 隐藏面板的类型 控件本身不在母版页中引用 而是通过 CMS 系统动态引用 我想在用户控件中使用findcontrol
  • C#6 中的长字符串插值行

    我发现 虽然字符串插值在应用于现有代码库的字符串 Format 调用时非常好 但考虑到通常首选的列限制 字符串对于单行来说很快就会变得太长 特别是当被插值的表达式很复杂时 使用格式字符串 您将获得一个可以拆分为多行的变量列表 var str
  • ASP.NET MVC 路由:如何从 URL 中省略“索引”

    我有一个名为 StuffController 的控制器 具有无参数索引操作 我希望从表单中的 URL 调用此操作mysite com stuff 我的控制器定义为 public class StuffController BaseContr
  • 逆向工程 ASP.NET Web 应用程序

    我有一个 ASP NET Web 应用程序 我没有源代码 该 bin 包含 10 个程序集和一个 compiled 文件 我在 App Code dll 上使用 Reflector 它向我显示了类和命名空间之类的东西 但它太混乱了 有没有什
  • .NET 4 的条件编译[重复]

    这个问题在这里已经有答案了 可能的重复 条件编译和框架目标 https stackoverflow com questions 2923210 c sharp conditional compilation and framework ta
  • 如何停止无限循环?

    我正在编写一个程序 该程序将计算三角形或正方形的面积 然后提示用户是否希望计算另一个 我的代码已经运行到可以计算任一形状的面积的程度 但随后不再继续执行代码的其余部分 例如 如果选择了正方形 则计算面积 然后返回到正方形边长的提示 我假设这
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • 为什么以下 C 程序会出现总线错误?

    我认为这是第一个失败的 strtok 调用 好久没写C了 有点不知所措 非常感谢 include
  • 如何得知客户端从服务器的下载速度?

    根据客户的下载速度 我想以低质量或高质量显示视频 任何 Javascript 或 C 解决方案都是可以接受的 Thanks 没有任何办法可以确定 您只能测量向客户端发送数据的速度 如果没有来自客户端的任何类型的输入来表明其获取信息的速度 您
  • DataContractSerializer 事件/委托字段问题

    在我的 WPF 应用程序中 我正在使用DataContractSerializer序列化对象 我发现它无法序列化具有事件或委托声明的类型 考虑以下失败的代码 Serializable public abstract class BaseCl

随机推荐