在 boost::shared_ptr 运算符 bool() 上旋转时需要 C++ 易失性吗? [复制]

2023-12-02

可能的重复:
何时在多线程中使用 易失性?

我有两个线程引用相同的内容boost::shared_ptr:

boost::shared_ptr<Widget> shared;

线程正在旋转,等待另一个线程重置boost::shared_ptr:

while(shared)
   boost::thread::yield();

在某个时刻,另一个线程会调用:

shared.reset();

我的问题是我是否需要将共享指针声明为volatile防止编译器优化调用shared.operator bool()脱离循环并且从未检测到变化?我知道如果我只是循环一个变量,等待它达到 0 我需要volatile,但我不确定是否boost::shared_ptr其实现方式在这里是不必要的。

编辑:我完全意识到条件变量可以用来以不同的方式解决这个问题。但在这种情况下,繁忙循环非常罕见,并且争用条件变量上的锁是我们不希望发生的开销。


Rant 1:

该代码可能不会按照您的想法执行。当你编写这样的代码时,你正在引入一个数据竞赛到你的代码中。这几乎肯定是一个错误这将导致你的程序不确定性失败.

数据结构(包括shared_ptr)通常不适合并发访问。不要在多个线程中同时修改同一结构。这可能会破坏结构。不要在一个线程中修改它并在另一个线程中读取它。读者可能会看到不一致的数据。Probably多个线程可以同时读取它。

如果您认为确实想要执行上述某些操作,请在可能标题为“线程安全”的部分中查明数据结构是否允许其中某些行为。如果确实允许的话,再看看你的表现是否really需要这个,然后使用它。 (有关文档共享指针不允许你正在做的事情。)

Rant 2:

现在,出于更高级别的考虑,您可能不应该通过等待指针设置为 NULL 来进行线程同步。实际上,可以将条件变量、障碍或 future 视为让一个线程等待另一个线程完成某些操作的一种方式。这是一个更好的界面,无论谁接下来查看您的代码(包括 6 个月后的您)都会感谢您。

我知道您担心真正同步的性能成本。不用担心这个。会没事的。如果您担心锁争用,请使用屏障或 future,它们没有需要争用的大共享锁。

警告:有时需要编写不惜一切代价避免锁定的代码。但是,除非您查看的分析器数据表明您的同步操作对于目标工作负载来说太慢,否则现在还不是时候。

Rant 3:

我希望shared在你的例子中是全球性的。否则,您将拥有多个线程,这些线程具有对同一对象的本地引用shared_ptr它指向您感兴趣的真实对象。这有点违背了引用计数指针的目的。请告诉我这是全球性的。

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

在 boost::shared_ptr 运算符 bool() 上旋转时需要 C++ 易失性吗? [复制] 的相关文章

  • C++:无法使用scoped_allocator_adaptor传播polymorphic_allocator

    我有一个vector
  • 自动从 C# 代码进行调试过程并读取寄存器值

    我正在寻找一种方法来读取某个地址的 edx 注册表 就像这个问题中所问的那样 读取eax寄存器 https stackoverflow com questions 16490906 read eax register 虽然我的解决方案需要用
  • Func 方法参数的首选命名约定是什么?

    我承认这个问题是主观的 但我对社区的观点感兴趣 我有一个缓存类 它采用类型的缓存加载器函数Func
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • iPhone SDK - 在后台线程中运行重复进程

    我有一个iPhone我想在其中每隔一段时间在后台执行一个方法的应用程序1第二 所以在我的主线程中 我有以下代码UIViewController viewDidLoad NSTimer timerWithTimeInterval 1 0 ta
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 如何在我的应用程序中使用 Windows Key

    Like Windows Key E Opens a new Explorer Window And Windows Key R Displays the Run command 如何在应用程序的 KeyDown 事件中使用 Windows
  • 为什么禁止在 constexpr 函数中使用 goto?

    C 14 对你能做什么和不能做什么有规则constexpr功能 其中一些 没有asm 没有静态变量 看起来相当合理 但标准也不允许goto in constexpr功能 即使它允许其他控制流机制 这种区别背后的原因是什么 我以为我们已经过去
  • 使用 C# 在 WinRT 中获取可用磁盘空间

    DllImport kernel32 dll SetLastError true static extern bool GetDiskFreeSpaceEx string lpDirectoryName out ulong lpFreeBy
  • 使用 Google Analytics API 在 C# 中显示信息

    我一整天都在寻找一个好的解决方案 但谷歌发展得太快了 我找不到有效的解决方案 我想做的是 我有一个 Web 应用程序 它有一个管理部分 用户需要登录才能查看信息 在本节中 我想显示来自 GA 的一些数据 例如某些特定网址的综合浏览量 因为我
  • 在 ASP.Net Core 2.0 中导出到 Excel

    我曾经使用下面的代码在 ASP NET MVC 中将数据导出到 Excel Response AppendHeader content disposition attachment filename ExportedHtml xls Res
  • Windows 窗体不会在调试模式下显示

    我最近升级到 VS 2012 我有一组在 VS 2010 中编码的 UI 测试 我试图在 VS 2012 中启动它们 我有一个 Windows 窗体 在开始时显示使用 AssemblyInitialize 属性运行测试 我使用此表单允许用户
  • 编译的表达式树会泄漏吗?

    根据我的理解 JIT 代码在程序运行时永远不会从内存中释放 这是否意味着重复调用 Compile 表达式树上会泄漏内存吗 这意味着仅在静态构造函数中编译表达式树或以其他方式缓存它们 这可能不那么简单 正确的 他们可能是GCed Lambda
  • 线程、进程和 Application.Exit()

    我的应用程序由主消息循环 GUI 和线程 Task Factory 组成 在线程中我调用一些第三方应用程序var p new Process 但是当我调用Application Exit 在消息循环中 我可以看到在线程中启动的进程仍在内存中
  • 我的 strlcpy 版本

    海湾合作委员会 4 4 4 c89 我的程序做了很多字符串处理 我不想使用 strncpy 因为它不会终止 我不能使用 strlcpy 因为它不可移植 只是几个问题 我怎样才能让我的函数正常运行 以确保它完全安全稳定 单元测试 这对于生产来
  • Windows 10 中 Qt 桌面应用程序的缩放不当

    我正在为 Windows 10 编写一个简单的 Qt Widgets Gui 应用程序 我使用的是 Qt 5 6 0 beta 版本 我遇到的问题是它根本无法缩放到我的 Surfacebook 的屏幕上 这有点难以判断 因为 SO 缩放了图
  • 将应用程序从 Microsoft Access 迁移到 VB 或 C#.NET

    我目前正试图说服管理层需要将我们的应用程序之一移植到 NET 该应用程序已经发展成为 Access 中的一个庞然大物 SQL 后端 拥有 700 个链接表 650 个表单 子表单 130 个模块和 850 个查询 我几乎知道这样做的所有主要
  • 在 URL 中发送之前对特殊字符进行百分比编码

    我需要传递特殊字符 如 等 Facebook Twitter 和此类社交网站的 URL 为此 我将这些字符替换为 URL 转义码 return valToEncode Replace 21 Replace 23 Replace 24 Rep
  • 如何在 C# 中播放在线资源中的 .mp3 文件?

    我的问题与此非常相似question https stackoverflow com questions 7556672 mp3 play from stream on c sharp 我有音乐网址 网址如http site com aud
  • 如何将字符串“07:35”(HH:MM) 转换为 TimeSpan

    我想知道是否有办法将 24 小时时间格式的字符串转换为 TimeSpan 现在我有一种 旧时尚风格 string stringTime 07 35 string values stringTime Split TimeSpan ts new

随机推荐

  • html5-canvas 在线移动对象

    我想在斜线上移动物体 我已经给出了我的代码 在我的第三个 div 的代码中 当我移动滑块时 我在这条线上画了一条斜线 我想移动一个对象 我在第一个分区中正在做类似的事情 我在曲线上移动物体的地方 我正在寻找一些函数 在其中我将提供点并且对象
  • 如何使用 .htaccess 允许在我的 iframe 中访问页面但不能直接访问?

    我有一个用 iframe 制作的网站 我想在自己的 iframe 中显示一个页面 但我想拒绝直接访问 我怎样才能在我的 htaccess 您可以使用Referer用于检查请求是否来自您网站上的链接 或 img src 或 iframe sr
  • Argparse,处理可重复的项目集

    是否可以创建一组相关且可重复的可选参数 假设我有三个参数 a b c 组成一个集合 a 是必需的 但 b 和 c 是可选的 更新 我希望能够指定多组这些 Script py a 1 b 2 c 3 a 4 c 6 a 7 b 8 a 10
  • 我需要将哪些参数传递给 PackageWeb powershell 脚本才能将其部署到我的远程计算机

    尽管如此 我还是在 MSBuild MSDeploy world 中闲逛 并且最近经常摸不着头脑 我希望能够仅构建一次 Web 应用程序项目并将其部署到多个配置 我找到了这个PackageWeb解决方案来自 Sayed I Hashimi
  • 如何将附加属性设置为布尔值

    我正在尝试设置附加属性元素添加到 Open API Schema 3 X 中 但不幸的是我无法在文档中找到任何可以帮助我的内容 我在 Spring boot 中有一个应用程序 它使用 Spring doc OAS 该 OAS 依赖于 Swa
  • 如何从网址中删除问号[重复]

    这个问题在这里已经有答案了 有什么办法可以删除网址中的问号吗 现在假设 URL 可以是http www domain com profile a 10但也可以是http www domain com profile b ticket 所以在
  • 使用 git Branch -f 或 git update-ref 快进现有分支是否更好?

    我意识到我可以使用git update ref快进我不在的现有分支 然后我发现类似的事情可以通过git branch f 我明白那个git update ref更加灵活 它可以移动任何参考 但这可能很危险 那么是不是更好用git branc
  • Sass中如何给全局变量赋值?

    我运行这个 Sass 代码 a 1 if 2 2 4 a 2 debug a 我期望看到 2 然而 输出是 Line 5 DEBUG 1 我知道 Sass 创建了一个新的 a里面的变量 if范围 我怎样才能改变这种行为并为全局分配一个值 a
  • SQLite UPSERT /更新或插入

    我需要对 SQLite 数据库执行 UPSERT INSERT 或 UPDATE 有一个命令 INSERT OR REPLACE 在许多情况下很有用 但是 如果您想由于外键而保留自动增量的 id 则它不起作用 因为它会删除该行 创建一个新行
  • 在 Perl 中打开和读取文件的最佳方法是什么?

    请注意 我并不是在寻找打开 读取文件的 正确 方式 或者每次都应该打开 读取文件的方式 我只是有兴趣了解大多数人使用什么方式 也许同时学习一些新方法 我的 Perl 程序中一个非常常见的代码块是打开一个文件并对其进行读取或写入 我见过很多这
  • 如何在 OpenGLES 中获取图像变量的绑定点

    我正在尝试在 GLES 着色器中获取图像变量的绑定点 我可以使用该代码对制服或着色器存储块执行此操作 GLenum Prop GL BUFFER BINDING GLint Binding 1 GLint ValuesWritten 0 g
  • 如何在JavaCC中使用反斜杠转义字符换行?

    我有一个任务是创建一个词法分析器 除了一点之外 我已经一切正常 我需要创建一个接受新行的字符串 并且该字符串由双引号分隔 该字符串接受任何数字 字母 某些指定的标点符号 反斜杠和分隔符内的双引号 我似乎不知道如何转义新行字符 是否有某种方法
  • SQLite:如何将查询结果保存为 CSV 文件?

    有没有办法可以将查询结果导出到 CSV 文件中 From here和 d5e5 的评论 您必须将输出切换到 csv 模式并切换到文件输出 sqlite gt mode csv sqlite gt output test csv sqlite
  • 将 YYYYMMDD 字符串转换为 Go 中的有效日期

    我想转换一个字符串 20101011 到有效日期 2010 10 11 但无法弄清楚我们该怎么做 I tried now time Now date now Format 20101011 and date time Parse 20101
  • Android:如何使用 Parse 作为替代 GCM 推送通知提供程序?

    请参阅问题末尾的 EDIT 2 Google 更新了推送的实现方式 因此更容易一起处理 gcm 和解析 我已经在应用程序中使用了 GCM 我想添加解析作为替代方案 这就是我现在所拥有的 所有权限都已正确声明
  • 从资源加载和解析 xml 时出现问题

    我已经编写了一个解析器 它可以从 HttpURLConnection 解析 xml 文件 这很好用 问题 我需要重写这个 以便从本地资源而不是从互联网加载 xml 文件 但我无法让它工作 只是为了让您了解原始 Web 解析器的外观 Inpu
  • 错误:在 Android Studio 中找不到名称为“default”的配置

    我正在使用 volley 库在 android 中执行网络操作 所以我试图在我的项目中添加这个库 该项目是在 Android Studio 和 gradle 系统中创建的 我在项目中添加了 volley 库 但是当我与 gradle 同步时
  • 条件 C# 二进制序列化

    我正在使用 BinaryFormatter 按条件序列化类及其变量 例如 Serializable public class Class1 private Class2 B Serializable public class Class2
  • 将参数传递给 eventListener 函数

    我有这个函数 check e 当我将其添加到 eventListener 时 我希望能够从 test 传递参数 这可能吗 就像说让 mainlink 变量传递参数一样 这还好吗 我把javascript放在下面 我也把它放在jsbin上 h
  • 在 boost::shared_ptr 运算符 bool() 上旋转时需要 C++ 易失性吗? [复制]

    这个问题在这里已经有答案了 可能的重复 何时在多线程中使用 易失性 我有两个线程引用相同的内容boost shared ptr boost shared ptr