多线程:我需要在只读方法中保护我的变量吗?

2023-11-21

我对使用锁来保护我的共享数据结构有几个疑问。我正在使用 C/C++/ObjC/Objc++

例如我有一个在多线程环境中使用的计数器类

class MyCounter {
private:
    int counter;
    std::mutex m;

public:
    int getCount() const {
        return counter;
    }
    void increase() {
        std::lock_guard<std::mutex> lk(m);
        counter++;
    }
};
  1. 我需要使用吗std::lock_guard<std::mutex> lk(m); in getCount()使其线程安全的方法?

  2. 如果只有两个线程会发生什么:读取器线程和写入器线程,那么我是否必须保护它?因为只有一个线程正在修改变量,所以我认为不会发生丢失更新。

  3. 如果共享基元类型变量有多个写入器/读取器(例如int)如果只锁写方法而不锁读方法会发生什么灾难? 8 位类型与 64 位类型相比有什么区别吗?

  4. 任何原始类型默认都是原子的吗?例如写入一个char总是原子的? (我知道这在 Java 中是正确的,但不知道 C++,如果平台很重要,我在 Mac 上使用 llvm 编译器)


是的,除非你能保证基础变量的变化counter是原子的,你需要互斥锁。

经典的例子,说counter是一个在(非原子)阶段递增的两字节值:

(a) add 1 to lower byte
    if lower byte is 0:
(b)     add 1 to upper byte

初始值为255。

如果另一个线程出现在低字节更改之间的任何位置a和高字节变化b,它将读取 0 而不是正确的 255(前增量)或 256(后增量)。

至于哪些数据类型是原子的,最新的 C++ 标准在<atomic> header.

If you don't具有 C++11 功能,那么什么类型是原子的就取决于实现。

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

多线程:我需要在只读方法中保护我的变量吗? 的相关文章

  • Poco c++Net:Http 从响应中获取标头

    我使用 POCO C Net 库进行 http 我想尝试制定持久缓存策略 首先 我认为我需要从缓存标头中获取过期时间 并与缓存值进行交叉检查 如果我错了 请告诉我 那么我如何从中提取缓存头httpResponse 我已经看到你可以用 Jav
  • CSharpRepl emacs 集成?

    我碰巧知道莫诺CSharpRepl http www mono project com CsharpRepl 是否有 emacs csharp 模式使用它在一个窗口中运行 REPL 并像 python 模式一样在另一个窗口中编译 运行 C
  • 使用 Visual Studio Express 2010 表单应用程序进行 C++ 多线程处理

    我正在开发一个 Windows 窗体应用程序 它连接到一个硬件 获取大量数据 1 GSample 秒 对其进行处理 然后单击按钮将其输出到屏幕上 我现在尝试在一个可以随时启动 停止的循环中自动化该过程 以便我可以在调整采集硬件的输入的同时对
  • 是否存在指向不同类型的指针具有不同大小的平台?

    C 标准允许指向不同类型的指针具有不同的大小 例如sizeof char sizeof int 是允许的 但是 它确实要求如果将指针转换为void 然后转换回其原始类型 它必须与其原始值进行比较 因此 从逻辑上来说 sizeof void
  • 检测到堆栈崩溃

    我正在执行我的 a out 文件 执行后 程序运行一段时间 然后退出并显示消息 stack smashing detected a out terminated Backtrace lib tls i686 cmov libc so 6 f
  • Gwan C#,如何获取HTTP标头?

    我需要它来重写 url 以了解我正在处理哪个友好的 url 用于用户代理和其他东西 EDIT public class Gwan MethodImplAttribute MethodImplOptions InternalCall exte
  • 计算另一个表达式中的 C# 表达式

    我想在另一个表达式中使用一个表达式 Expression
  • 在 omp 并行 for 循环中使用 unique_ptr 会导致 SEG.FAULT

    采取以下代码 include
  • 使用查询表达式对 List 进行排序

    我在使用 Linq 订购这样的结构时遇到问题 public class Person public int ID get set public List
  • MFC:如何设置CEdit框的焦点?

    我正在开发我的第一个简单的 MFC 项目 但我正在努力解决一个问题 想要设置所有的焦点CEdit其中一个对话框中的框 我的想法是 当打开对话框时 焦点位于第一个编辑框上 然后使用 选项卡 在它们之间交换 我看到了方法SetFocus 但我无
  • 使用 C# 和 wpf 创建类似 Dock 的应用程序

    我需要创建一个与我们购买笔记本电脑时获得的应用程序类似的应用程序 仅当鼠标指针到达窗口顶部时它才可见 那么我怎样才能使用 C 4 0 来做到这一点呢 http www notebookcheck net uploads pics win2
  • 使用具有抗锯齿功能的 C# 更改抗锯齿图像的背景颜色

    我有一个图像需要更改背景颜色 例如 将下面示例图像的背景更改为蓝色 然而 图像是抗锯齿的 所以我不能简单地用不同的颜色替换背景颜色 我尝试过的一种方法是创建第二个图像 仅作为背景 并更改其颜色并将两个图像合并为一个图像 但是这不起作用 因为
  • 英文日期差异

    接近重复 如何计算相对时间 https stackoverflow com questions 11 how do i calculate relative time 如何在 C 中计算某人的年龄 https stackoverflow c
  • 选择查询不适用于使用Parameters.AddWithValue 的参数

    C 中的以下查询不起作用 但我看不出问题所在 string Getquery select from user tbl where emp id emp id and birthdate birthdate cmdR Parameters
  • 如何调试 .NET 运行时中的内部错误?

    我正在尝试调试一些处理大文件的工作 代码本身works 但 NET 运行时本身会报告零星错误 对于上下文 这里的处理是一个 1 5GB 文件 仅加载到内存中一次 在循环中处理和释放 故意尝试重现此否则不可预测的错误 我的测试片段基本上是 t
  • 如何在 winforms 应用程序的主屏幕显示之前显示欢迎屏幕?

    我想在应用程序启动时加载欢迎屏幕 然后用户单击欢迎屏幕上的按钮 然后关闭欢迎屏幕 最后显示主屏幕 static void Main startup method being called Application EnableVisualSt
  • C++ 中 void(*)() 和 void(&)() 之间的区别[重复]

    这个问题在这里已经有答案了 在此示例代码中 func1是类型void int double and funky是类型void int double include
  • 通过 Tab 键浏览 XML 文档字段

    In VB NET you can move through the fields in the XML member documentation with the Tab key 这在 C 中不起作用 还有其他方法吗 除了用鼠标将光标放在
  • DataContractSerializer 事件/委托字段问题

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

    我遇到了一个错误 尽管声明了变量 failturetext 和 userName 错误仍然出现 谁能帮帮我吗 Use of Unassigned local variable FailureText Use of Unassigned lo

随机推荐

  • React Apollo 从状态动态创建查询

    这是一个模型情况 我的数据库中有一些字段 比如颜色 大小 高度 我可以获取这些字段并将其显示给可以选择这些字段的用户 然后将它们设置为组件状态 我想要实现的是动态创建GQL查询 不是查询变量 来自存储在状态中的这些字段 Example im
  • 如何获取通知区域图标列表?

    我正在尝试获取代码以列出通知区域中时间左侧可见的所有图标 我一直在尝试EnumDesktopWindows and GetWindowLong 没有找到任何方法来挑选系统托盘图标 谢谢 使用可访问性接口枚举子级User Promoted N
  • C 地址运算符中的函数指针“不必要”

    在 C 中使用 qsort 我们传入一个比较函数 例如 int cmp const void const void qsort 的原型期望int const void const void 所以我们打电话 qsort cmp 但调用以下方法
  • CodeIgniter 列表字段

    我正在使用 CodeIgniter 2 1 3 我的功能有问题list fields 它应该返回 MySQL 结果的字段数组 所以我下面的代码应该列出 MySQL 结果的所有字段 query this gt db gt query SELE
  • Android OpenGLES 2 从触摸坐标拾取光线,非投影计算略有关闭

    我正在尝试通过相交光线测试来实现基于触摸坐标的对象拾取 我无法找到有关将触摸坐标转换为世界上使用的坐标系以构造这条射线的信息 到目前为止 我的理解是应用于场景中每个顶点的矩阵是 projectionMatrix viewMatrix mod
  • Swift 字典错误?

    所以我在 Swift 中开始了一个项目 我遇到了这个问题 这段代码有效 var dictionary a valueOfA b valueOfB c valueOfC println dictionary dictionary c newV
  • Spring组件扫描的性能取决于扫描包的大小吗?

    在我们的应用程序中 我们遇到了组件扫描的性能问题 它非常慢 并且其性能不依赖于扫描包中的类数量 我们的 spring 配置文件中的每一行都是这样的
  • 多个小查询与单个长查询。哪一种效率更高?

    以下哪一种方法更有效 单个较长查询 SELECT COUNT AS num FROM SELECT users UID cnumber FROM users JOIN identity ON users UID identity UID W
  • 与多个 Chrome Docker 容器的 Websocket 通信

    我有一个 Chrome 容器 使用这个 Dockerfile 根据应用程序容器的请求呈现页面 基本流程是 应用程序向 Chrome 发送 http 请求 并作为响应接收要使用的 websocket url 例如ws chrome examp
  • 标签位置应固定在右侧并向左增长

    即使标签长度不同 如何将标签设置为右侧对齐 我有一组标签 它们彼此相邻 也彼此下方 现在的问题是它们总是从标签行的左侧对齐 但我需要它们在右侧对齐 因为它们显示其他行的总和 只是为了验证我不是在谈论文本对齐 我正在寻找一种对齐标签的解决方案
  • 单击取消按钮 showInputDialog

    我有一个关于按输入对话框的取消按钮的问题 我以前曾问过类似的问题 所以如果我似乎重复了自己的话 我深表歉意 我遇到的主要问题是 无论我按下取消键 我的代码都会执行 并且即使我不添加任何输入 也会建立套接字连接 为什么会发生这种情况以及如何避
  • Xcode 5 和phonegap:为设备构建链接器错误,但不为模拟器构建链接器错误

    我们的phonegap应用程序对于iPhone模拟器构建得很好 但在iPhone上构建应用程序时会生成链接器错误 唯一改变的是安装 testflight 和测试应用程序 我们已经删除了 testflight 和测试应用程序 但链接器错误仍然
  • Apache Shiro 和 SSO

    Apache Shiro 是一个 Java 安全框架 支持 SSO 我有多个子域 每个子域都有单独的应用程序运行 我如何使用 Apache Shiro Web 过滤器 或任何其他过滤器 来提供单点登录 在使用 Apache Shiro 之前
  • 在 Oracle SQL 中删除表

    每当我尝试删除表或创建表时 它都会显示以下错误 DROP TABLE SUBURB DROP TABLE STOCKITEM DROP TABLE MANUFACTURER DROP TABLE WAREHOUSE DROP TABLE C
  • 重写规则以仅检测数字

    我正在尝试创建一个重写规则 该规则将仅检测数字并相应地转发它们 我希望如果出现除数字以外的任何内容 则忽略重写规则 index php OK OK 42365 重写为view php id 42365 到目前为止我所拥有的 RewriteE
  • 我正在做正确的事情将分贝从 -120 - 0 转换为 0 - 120

    我想测量周围的音量 不太确定我做的是否正确 我想创建一个范围从 0 安静 到 120 非常吵闹 的 VU 表 我得到了峰值功率和平均功率 但在正常安静环境中非常高 请给我一些指示 void viewDidLoad super viewDid
  • 如何最好地消毒 ruby​​ on Rails 中的字段

    我目前有一个控制器从前端的 TinyMCE 捕获一些 html 如果我修补萤火虫 就可以提交脚本标签并将警报消息等注入到屏幕上 编辑 目前我正在使用清理助手在模型中修复此问题 require action view class NotesC
  • 按组有条件 NA 填充

    edit这个问题最初是问的data table 任何包的解决方案都会很有趣 我对一个更普遍的问题的特定变体有点困惑 我有与 data table 一起使用的面板数据 我想使用 data table 的分组功能来填充一些缺失的值 不幸的是它们
  • Python 中的整数到十六进制转换

    a 1 print hex a 上面给了我输出 0x1 我如何获得输出0x01反而 您可以使用format gt gt gt a 1 gt gt gt 0 02x format a 01 gt gt gt 0x 0 02x format a
  • 多线程:我需要在只读方法中保护我的变量吗?

    我对使用锁来保护我的共享数据结构有几个疑问 我正在使用 C C ObjC Objc 例如我有一个在多线程环境中使用的计数器类 class MyCounter private int counter std mutex m public in