这是互斥锁的情况吗?
Is this a case for a mutex?
本文关键字:情况 更新时间:2023-10-16
我有一个从设备捕获数据的线程。我从 gui 启动/停止线程。目前,线程会定期检查 appcontext 中的bool
成员isCapturingEnabled
。我从 gui 切换这个bool
成员以停止线程。
在这种情况下,我应该使用互斥锁吗?因为捕获线程和主线程可能会尝试同时写入和读取bool
。
您将遇到的问题是,如果没有某种锁定或内存屏障,则GUI线程可能会(例如)将bool
设置为true,但由于编译器优化或CPU级别的优化,线程实际上不会看到这一点。
您需要做的是以这样一种方式写入bool
:从内存加载当前状态,并正确写回新状态,以便所有线程都可以看到更改。一种方法是使用互斥锁,正如您已经确定的那样。其他方法是使用内存屏障来确保您访问正确的内存视图。大多数语言或操作系统通常都有某种 API,用于以原子方式操作内存,最大可达单词大小。例如,在Windows上有InterlockedCompareExchange功能。
但是,在 95% 的情况下,从性能的角度来看,仅将读/写包装在互斥锁中就足够了,并且很容易根据多线程正确性进行推理。
相关文章:
- 在没有太多条件句的情况下,我如何避免被零除
- 为什么在没有显式默认构造函数的情况下,将另一个结构封装在联合中作为成员的结构不能编译
- 函数中堆分配的效果与缺少堆分配的情况
- 在未初始化映射的情况下,将值插入到映射的映射中
- 是默认情况下分配给char数组常量的值
- 为什么我不能在不创建字符串变量的情况下使用函数的字符串输出
- 如何在不产生任何垃圾的情况下获得C中的像素
- 在已经使用Git的情况下减少编译时间
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- 如何在没有信号的情况下从C++执行QML插槽
- 如何在不知道向量大小的情况下输入向量内部的向量?
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 为什么在某些情况下不写入此文件?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- UE4-如何在给定4个屏幕坐标的情况下缩放纹理或材质
- 为什么这个音频包络不能通过开关的情况?
- 为什么需要复制构造函数,在哪些情况下它们非常有用
- 在C++中如何在没有pow的情况下进行基础计算