单个变量的线程安全

2024-01-07

我了解线程安全的概念。我正在寻找在尝试保护单个变量时简化线程安全的建议。

假设我有一个变量:

double aPass;

我想保护这个变量,所以我创建了一个互斥体:

pthread_mutex_t aPass_lock;

现在我可以想到两种好方法,但它们都有令人讨厌的缺点。首先是创建一个线程安全类来保存变量:

class aPass {
    public:
        aPass() {
            pthread_mutex_init(&aPass_lock, NULL);
            aPass_ = 0;
        }

        void get(double & setMe) {
            pthread_mutex_lock(aPass_lock);
            setMe = aPass_
            pthread_mutex_unlock(aPass_lock);
        }

        void set(const double setThis) {
            pthread_mutex_lock(aPass_lock);
            aPass_ = setThis;
            pthread_mutex_unlock(aPass_lock);
        }
    private:
        double aPass_;
        pthread_mutex_t aPass_lock;
};

现在这将保留aPass完全安全,不会出错,永远不要碰它,耶!然而,看看这些乱七八糟的东西,想象一下访问它时的混乱。总的。

另一种方法是让它们都可访问,并确保在使用 aPass 之前锁定互斥锁。

pthread_mutex_lock(aPass_lock);
   do something with aPass
pthread_mutex_unlock(aPass_lock);

但是,如果有新人加入该项目,或者您有一次忘记锁定它怎么办?我不喜欢调试线程问题,它们很难。

有没有一种好方法(使用pthreads,因为我必须使用几乎没有boost支持的QNX)来锁定单个变量而不需要一个大类,这比只创建一个互斥锁来配合它更安全?


std::atomic<double> aPass;

前提是你有 C++11。

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

单个变量的线程安全 的相关文章

随机推荐

  • java.lang.NoClassDefFoundError:javax.microedition.io.Connector

    我正在尝试使用 net Web 服务 当我从手机运行它 调试 时出现以下错误 java lang NoClassDefFoundError javax microedition io Connector 当我调用传输对象时出现错误 ht c
  • 命名空间内的#define 语句

    如果我在命名空间中有 define 语句 namespace MyNamespace define SOME VALUE 0xDEADBABE 我说 define 语句不限制于命名空间是否正确 以下是 正确 的做法吗 namespace M
  • 如何从浏览器下载mp2t格式的视频

    如何从网站上的 jw 播放器下载 mp2t 视频 视频似乎是位 片段 对我来说工作 在火狐浏览器中 打开F12 工具 Firefox 标签网络 刷新页面 开始视频 过滤器 媒体 第一个文件应该是这样的文件 FILE NAME XYZ mp4
  • 如何在cmd for循环中迭代字符串?

    我正在尝试在批处理脚本中迭代字符串 set var 1 2 3 for F i in var do echo i 并得到这个输出 C gt batch bat C gt set var 1 2 3 C gt for F i in 1 2 3
  • Django 迁移和 FileSystemStorage 取决于设置

    在我的 Django 应用程序中 我使用FileSystemStorage对于生成的文件 我这样初始化它 import os from urlparse import urljoin from django conf import sett
  • POSIX 队列和 msg_max

    我正在摆弄 POSIX 队列 遇到了一个问题 创建新队列时 我可以指定消息的大小以及队列中可以有多少消息 我的正常限制是 10 如 proc sys fs mqueue msg max 除了在程序执行期间更改它之外 还有一种简单的方法吗 e
  • 节点 8 的推荐 typescript 配置

    如果我想在 Node 8 上使用已编译的源代码 推荐的 typescript 配置是什么 大多数教程使用以下内容tsconfig json compilerOptions target es6 module commonjs 但现在我发现
  • multiprocessing.Queue 的工作示例

    在从这个问题中指出它之后 我正在寻找 multiprocessing Queue 的工作示例 Python 使用多处理器 https stackoverflow com questions 4838738 python utilizing
  • Python 3 中列表内的列表分组

    我有一个字符串列表列表 如下所示 List1 John Doe 1 2 3 Henry Doe 4 5 6 我想变成这样的东西 List1 John Doe 1 2 3 Henry Doe 4 5 6 但我似乎很难这样做 List1 Joh
  • 为什么通用 ICollection 不在 .NET 4.5 中实现 IReadOnlyCollection?

    在 NET 4 5 C 5 中 IReadOnlyCollection
  • UISwipeGestureRecognizer 滑动长度

    知道是否有办法获取滑动手势或触摸的长度 以便我可以计算距离 不可能通过滑动手势获得距离 因为当手势结束时 SwipeGesture 会触发您可以准确访问该位置一次的方法 也许您想使用 UIPanGestureRecognizer 如果您可以
  • 如何从 Azure 数据工厂运行 PowerShell

    I have PowerShell该脚本将复杂的 CSV 文件分割为每 1000 条记录的较小的 CSV 文件 这是代码 i 0 Get Content C Users dell Desktop Powershell Input bigsi
  • SignTool 错误:访问被拒绝

    我正在尝试使用 pfx 文件签署外部 dllSignTool在cmd exe中使用以下代码 SignTool 签名 f MyCert pfx p MyPassword MyControl dll 但是 我不断收到以下错误消息 Done Ad
  • 如何过滤列表

    我正在编写一个简单的函数 从列表中取出任何奇数并返回仅包含偶数的列表 def purify numbers for i in numbers if i 2 0 numbers remove i return numbers print pu
  • 无法从其他应用程序读取 SharedPreferences

    EDITED 我有一个应用程序可以像这样写入 SharedPreferences Context otherAppsContext null try otherAppsContext createPackageContext AfroKey
  • 如何获取 jPlayer 中歌曲当前播放的时间? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我使用 jPlayer 控件来播放音
  • 在notifyAppWidgetViewDataChanged之后没有调用RemoteViewService中的onDataSetChanged()

    在我的 AppWidgetProvider 类中 我有以下代码onUpdate method Update each of the widgets with the remote adapter for int appWidgetId ap
  • 完美转发、可变参数模板、initializer_list - 一起

    gcc 4 8 1 和 clang 3 3 c 11 功能完整 我需要在某些构造 make shared c 14 make unique 等元素的函数中转发参数 但我对类型推导 转发初始值设定项列表 数组有问题 我需要的工作示例foo f
  • 了解托管 bean/支持 bean [重复]

    这个问题在这里已经有答案了 我正在学习 Java EE 6 我正在尝试掌握它的整体形象 我正在阅读有关 JSF 以及如何添加组件的内容 我正在将组件中的值设置 读取到具有 ManagedBean 注释的 bean 我在正确理解它时遇到一些困
  • 单个变量的线程安全

    我了解线程安全的概念 我正在寻找在尝试保护单个变量时简化线程安全的建议 假设我有一个变量 double aPass 我想保护这个变量 所以我创建了一个互斥体 pthread mutex t aPass lock 现在我可以想到两种好方法 但