简单数据类型的互斥锁

2024-02-29

我对并发还很陌生,并且在决定如何使用互斥体时遇到困难。目前,它们散布在我的代码中两个线程交互的地方。这种互斥体的使用是否合适?

class Foo
{
public:
    void SetMember(int n) {  AcquireMutex(..); n_ = n; ReleaseMutex(...);}
private:
   Thread()
   {
      while(1)
      {
         AcquireMutex(..);
         // Do something with n_
         ReleaseMutex(...);
       }
   }
};

我有很多数据成员可以通过不同的线程从外部读取和设置,并且我发现跟踪所有互斥体的获取和释放是一件令人头痛的事情。


原始类型的突变不保证是线程安全的,或者更具体地说是原子的。事实上,如果你看看<atomic> http://en.cppreference.com/w/cpp/atomic/atomic您会注意到有几个专业,包括std::atomic_int.

From 参考参数 http://en.cppreference.com/w/cpp/atomic/atomic

原子类型的对象是唯一不受数据竞争影响的 C++ 对象;也就是说,如果一个线程写入一个原子对象,而另一个线程从中读取,则该行为是明确定义的。

为了具体回答有关互斥体使用的问题,是的,您在示例中使用互斥体很好。一般来说,您希望保持互斥体的时间尽可能短。换句话说,如果您有一个需要执行大量工作的函数,则只需锁定非线程安全代码周围的互斥锁,然后在代码线程安全后立即将其解锁。

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

简单数据类型的互斥锁 的相关文章

  • VSTS 构建失败/发布无法在 bin 文件夹中找到 roslyn\csc.exe

    我们有一个网站项目 安装了以下 nuget 软件包 Microsoft CodeDom Providers DotNetCompilerPlatform 1 0 8 Microsoft Net Compilers 2 4 0 The web
  • 如何使用 ASP.NET MVC 进行 HTTP 调用?

    我正在尝试做的事情 我试图练习进行 HTTP 调用 如果这就是它的名字 来自一个简单的 ASP NET MVC Web 应用程序 为此 我尝试从以下位置获取天气详细信息打开天气地图 http openweathermap org appid
  • 中间件 API 的最佳实践是什么? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们正在开发一个中间件 SDK 采用 C 和 Java 语言 供游戏开发人员 动画软件开发人员 阿凡达开
  • 同步执行异步函数

    我对此主题进行了大量搜索 并且阅读了本网站上有关此主题的大部分帖子 但是我仍然感到困惑 我需要一个直接的答案 这是我的情况 我有一个已建立的 Winform 应用程序 但无法使其全部 异步 我现在被迫使用一个全部编写为异步函数的外部库 在我
  • OpenCV Visual Studio ntdll.dll

    我尝试在 Visual Studio 2013 上使用 OpenCV 2 4 10 创建一个项目 但由于以下异常 到目前为止我运气不佳 请建议帮助 TIA letstryitonemoretime exe Win32 Loaded C Us
  • CMake 和 Visual Studio:如何获得快速、安静的命令行构建?

    我有一个 cmake 项目 它成功地完成了我想要的一切 但我有大约 100 个文件 当我只需要重新编译一个文件时 我厌倦了每次看到生成的巨大输出 每个文件 30 行 明确地说 我正在编译cmake build 得到这个结果 我需要传递给编译
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 具有多重继承的类的 sizeof

    首先 我知道 sizeof 取决于机器和编译器的实现 我使用的是 Windows 8 1 x64 gcc 5 3 0 没有标志传递给编译器 我从大学讲座中得到了以下代码 include
  • 'goto *foo' 其中 foo 不是指针。这是什么?

    我正在玩标签作为值 https gcc gnu org onlinedocs gcc Labels as Values html并最终得到这段代码 int foo 0 goto foo 我的 C C 经验告诉我 foo means dere
  • 正则表达式删除某些字符周围不需要的空格

    我正在尝试从 JavaScript 文件中删除一些不需要的空格 并在将文件发送到客户端之前使用 C 和 Regex 组合文件 我有一个JavascriptHandler处理 js 文件 效果很好 这是我用来 打包 JavaScript 的函
  • 使用成员作为实现者来实现接口

    我有实现 IA 的 A 类 现在我需要创建也应该实现 IA 的类 B B 类有 A 类的实例作为成员 有什么方法可以定义A的实例实现B类中的IA吗 interfase IA void method1 void method2 void me
  • 枚举器上的 [[maybe_unused]]

    查看规格 maybe unused http en cppreference com w cpp language attributes 它指出 出现在类 typedef 变量 非静态数据成员 函数 枚举或枚举器的声明中 如果编译器对未使用
  • 在不使用 Thread.Sleep c# 的情况下延迟发送电子邮件

    我有一个 for 循环 它循环并每个循环发送一封电子邮件 现在我正在使用 thread sleep 但我希望用户仍然能够与程序交互 只需取消该循环即可 是否可以在不使用 thread sleep 的情况下做到这一点 您是否在 UI 线程上运
  • 如何用C++解析复杂的字符串?

    我试图弄清楚如何使用 解析这个字符串sstream 和C 其格式为 string int int 我需要能够将包含 IP 地址的字符串的第一部分分配给 std string 以下是该字符串的示例 std string 127 0 0 1 1
  • std::string 在 Visual Studio 上的具体行为?

    我有一个项目需要读取 写入大文件 我决定使用 ifstream read 将这些文件一次性放入内存中 放入 std string 中 这似乎是在 C 中执行此操作的最快方法 http insanecoding blogspot com 20
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • 需要使用 openssl 加密和解密文件的示例 C 代码

    我正在用 Linux C 编写代码 我需要使用以下命令来加密和解密文件 openssl 目前 我使用系统命令 des3 e nosalt k 0123456789012345 in inp file out out file 进行加密 使用
  • 如何使用简历实现一个“一网打尽”的异常处理程序?

    我想知道我怎样才能写一个抓住他们全部应用程序级别的异常处理程序将为用户提供恢复应用程序流程的选项 如果您正在运行 Windows 窗体应用程序 将处理程序添加到Application ThreadException event
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐

  • 将 JSON 字符串解析为 List

    string json People FirstName Hans LastName Olo FirstName Jimmy LastName Crackedcorn var obj JObject Parse json List
  • 在 C++ 中初始化后更改引用

    class mClass public int uu 9 mClass m1 mClass m2 m1 uu 8 m2 uu 7 mClass ppp m1 ppp m2 Is it possible to change reference
  • RemoveDuplicates 函数 - 如何设置多列?

    我正在尝试使用RemoveDuplicates函数使用Excel Interop 但我对如何将列数组传递给它感到困惑 我已经知道我不能把它当作一个简单的int 数组 因为它在运行时给出异常 并且我可以传递一个整数并且它可以工作 但我希望能够
  • NSPredicate - 基于 BOOLEAN 存储值过滤值

    我有一个名为 Entry 的核心数据模型对象 在此我有一个属性 IsFavorite 我想使用 NSPredicate 来过滤 NSFetchedResultsController 的结果 目前 当执行提取时 我收到 EXC BAD ACC
  • Android 软件键盘以编程方式在数字和字母之间切换

    我有一个 EditText输入模式 文本 默认情况下 软件键盘显示为字母顺序 用户必须通过按特定键 如 123 将其切换为数字 Having textinputMode 是否可以默认显示数字键盘而不是字母键盘 我需要字母和数字 但数字的使用
  • 使用 phpmailer 的电子邮件正文中出现感叹号

    我正在使用 phpmailer 在我的网站上发送电子邮件 我的代码工作正常 但有时在电子邮件正文中随机位置包含感叹号 我的代码如下 mail gt SetFrom FROM EMAIL FROM NAME emailid of sender
  • 特殊撇号会破坏 JSON

    7671 gt Sleaford Carre s 是 result 中的一个元素 result json encode result echo result outputs 7671 null 请注意 这不是正常的撇号 单引号 或反勾号 我
  • git gc -- 积极推送到服务器?

    这好像是git gc aggressive确实清理了我的仓库 但是当我这样做时git push一切都已经是最新的了 有没有办法清理服务器 2012 I know that GitHub will run git gc periodicall
  • Android - 可以在多个帐户中发布具有相同密钥库文件的不同应用程序吗? [复制]

    这个问题在这里已经有答案了 我已上传签名apk文件与keystore在客户端Developer Account 现在 我有来自同一客户 具有不同开发人员帐户的另一个应用程序 我可以上传签名吗apk文件具有相同的keystore文件或者我应该
  • Fluent nHibernate 和 asp.net MVC 入门

    我考虑使用 Fluent nhibernate 通过我的 asp net mvc web 应用程序进行数据访问 任何描述如何使用 asp net mvc web 应用程序设置 Fluent nHibernate 的好文章 This seri
  • Laravel 迁移 - 完整性约束违规:1452 无法添加或更新子行:外键约束失败

    我正在尝试对表运行迁移inventories我通过这次迁移创建的 Schema create inventories function Blueprint table table gt increments id table gt inte
  • 使用正则表达式前瞻,egrep

    如果您的文件包含 apples are good apple cider is also good 为什么会egrep apples app file无法接听任何线路 在 MAC 上使用egrep 2 5 1 扩展正则表达式不具有积极的前瞻
  • 实体框架 4.1 InverseProperty 属性

    只是想了解更多RelatedTo属性 我发现它已被替换为ForeignKey and InversePropertyEF 4 1 RC 中的属性 有谁知道有关此属性变得有用的场景的任何有用资源 我应该在导航属性上使用此属性吗 例子 publ
  • 使用 Rails 测试 PayPal

    我需要测试新的 PayPal 与我的应用程序的集成 我在开发环境中使用 PayPal 沙箱 为了测试整个界面 我发现ngrok https ngrok com 可能会解决来自 PayPal 的消息问题 我使用安装了 ngrokapt get
  • 如何在 IBM DB2 中的导出结果中包含列标题

    我试图使用命令从 DB2 中的表中导出数据 我想导出到 csv 文件中 但是列标题不存在 还需要列标题 那么我可以在 sql 查询中添加什么也获取列标题 这在最新的 2019 Db2 11 5 版本和 Db2 Warehouse 本地和云上
  • 电池使用情况 - iOS

    我想在应用程序的状态栏上显示应用程序的电池使用情况 它使用 GPS 因此 GPS 信号和应用程序的电池使用详细信息对于用户了解电池消耗情况很有用 有没有办法获取设备的电池使用情况 并仅显示消耗的电池量my app独自的 在仪器上 它显示随时
  • 带有目标目录的符号链接二进制文件

    我有一个二进制文件 它加载具有相对路径的资源 我想在 usr bin 中放置一个链接 我努力了ln s game directory game usr bin game 它启动了我的二进制文件 但无法加载我的资产 因为它显然找不到文件夹 a
  • 在搜索栏步骤上方添加具有不同字体大小的标签,与搜索栏拇指垂直对齐

    I would like to create a Seekbar above which there will be text label on each Seekbar step what it should look like is s
  • 使用 C# 设置进程“图像名称”和“描述”

    我想尽可能详细地讨论这个问题 这样问题就很容易理解answer able 本质上我需要一种设置方法进程名称 and 流程说明在应用程序上使用 C startup 这是我想要更改的示例 Note 我想用代码设置我自己的 C 应用程序图像和描述
  • 简单数据类型的互斥锁

    我对并发还很陌生 并且在决定如何使用互斥体时遇到困难 目前 它们散布在我的代码中两个线程交互的地方 这种互斥体的使用是否合适 class Foo public void SetMember int n AcquireMutex n n Re