如何正确离开临界区?

2024-04-28

我有以下 C++ 代码,我在其中使用临界区对象 https://msdn.microsoft.com/en-us/library/windows/desktop/ms682530(v=vs.85).aspx:

EnterCriticalSection(&cs);

// code that may throw an exception

LeaveCriticalSection(&cs);

我怎样才能确保LeaveCriticalSection即使抛出异常也会调用函数?


只需编写一个使用析构函数进行清理的守卫:

struct Guard {
  CriticalSection& cs;
  Guard(CriticalSection& cs)
  : cs(cs)
  {
    EnterCriticalSection(cs);
  }
  ~Guard() {
    LeaveCriticalSection(cs);
  }
  Guard(const Guard&) = delete;  
  Guard& operator = (const Guard&) = delete;
};

Usage:

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

如何正确离开临界区? 的相关文章

随机推荐

  • C++ STL 下一个排列与组合

    我知道我可以使用std next permutation在包含元素的某些容器上 1 2 3 这将生成该序列的 6 种排列 我想做的是给定一些设置 1 2 3 4 5 6 生成大小为 3 的所有可能的排列 因此对于这个例子 4 3 2 将是由
  • 如何在主活动中注册接收者? [复制]

    这个问题在这里已经有答案了 我有一个SmsReceiver我想在主活动中注册的类 我到底应该做什么 我是安卓新手 你可以做两件事 创建和定义BroadcastReceiver in the Manifest 创建并注册BroadcastRe
  • 获取 $_SERVER['AUTH_USER'] 的空白值

    我有一个在 Windows 2008 Server R2 上运行的 PHP 应用程序 它使用 PHP 的 LDAP 库根据 Active Directory 对用户进行身份验证 As per 这个答案 https stackoverflow
  • OCaml:如何运行包含库的脚本

    我正在按照 Real World OCaml 一书来学习 OCaml 许多程序都需要使用 Jane Street Core 库 当我在顶层使用这个核心库中的函数时 它工作得很好 在那里 我只需使用以下命令来打开 Core 库 use top
  • YouTube iframe 不响应 postMessage 命令

    我正在尝试使用来自父级的 postMessage 命令来控制 YouTube iframe 但它似乎不起作用 由于多种原因 我没有使用 YouTube API 只是使用带有 YouTube 嵌入视频的普通 iframe 我尝试发送命令的方式
  • monodevelop 2.1+ 支持 Visual Studio 2010 项目文件吗?

    monodevelop 2 1 是否支持 Visual Studio 2010 项目文件 但是 如果不支持 有人知道计划何时提供支持吗 我问的原因是我有一个在 VS2008 和 Monodevelop 中都使用的解决方案 当我在 2010
  • 为什么 reposync 没有签出我在清单文件中指定的分支?

    假设我有以下清单文件repo https source android com setup develop repo tool MCVE https stackoverflow com help minimal reproducible e
  • 如何通过父进程杀死子进程?

    我使用创建一个子进程fork 如果子进程无法在30秒内完成执行 父进程如何杀死子进程 我想让子进程最多执行 30 秒 如果超过30秒 父进程就会杀死它 你有想法这样做吗 向其发送 SIGTERM 或 SIGKILL http en wiki
  • Dropzone.js 和每个文件的完整路径

    我正在尝试使用 Dropzone js 重新创建删除的文件 文件夹的文件夹结构 有没有办法访问每个文件的完整路径 以便可以在 php 端重新创建目录结构 这是一种简单的方法 您可以额外发送某些文件夹中所有文件的完整路径 dropzone o
  • Xgboost:bst.best_score、bst.best_iteration 和 bst.best_ntree_limit 有什么区别?

    当我使用 xgboost 训练我的数据时2 cates classification problem 我想使用提前停止来获得最佳模型 但我对在预测中使用哪一个模型感到困惑 因为提前停止将返回 3 个不同的选择 例如 我应该使用 preds
  • 读写文本文件的最佳方法

    我正在使用最新版本的 Lazarus IDE 并且我有一个Memo1在我的 TForm1 上 我必须加载一个文本文件Memo1然后编辑备忘录的每一行 我使用Memo1 Lines Strings i 最后 我必须将编辑后的备忘录保存在特定路
  • 对浮点数求反总是安全的吗

    考虑 double f foo double g f where foo 可以返回分配给的任何内容f is double g f 在 C 和 C 中安全吗 对于 IEEE 754 类型 显然是这样 但 C 和 C 并不限制浮点实现 与 Ja
  • 数组向量无法编译[重复]

    这个问题在这里已经有答案了 这个简单的程序 include
  • TreeSet 给出不正确的输出 - Java8

    在处理树集时 我发现了非常奇怪的行为 根据我的理解 以下程序应该打印两行相同的行 public class TestSet static void test String args Set
  • 如何调试 iOS 应用程序在启动时崩溃,仅在程序集文件中设置断点

    我遇到了当前正在开发的应用程序的问题 问题是应用程序在启动时在后台运行一段时间后崩溃 并且仅在这种情况下 在应用程序被杀死时启动应用程序不会导致调试器或手机崩溃 无论是否进行调试 在后台启动应用程序大约 5 10 分钟都不会导致崩溃 在后台
  • 以编程方式设置 Swift 元素的位置

    我在故事板中定义了一个标签 我正在尝试以编程方式更改其位置 SO 上已有一些问题似乎可以解决此问题 但似乎没有一个解决方案有效 即标签不移动 我已经删除了标签上所有现有的限制 但无济于事 我试过了 class LandingViewCont
  • 使用 Prism 在 Xamarin Forms 的后台服务中实现依赖注入

    我在我的 xamarin 表单项目中使用 Prism 我能够在我的视图模型中使用依赖注入 构造函数注入 没有任何问题 我还利用后台服务在后台推送长时间运行的任务 如何做我在后台服务中注入依赖项 当我尝试将接口对象作为参数传递给构造函数 Sy
  • CSV 实际上是....分号分隔值...(在 AZERTY 上导出 Excel)

    我在这里有点困惑 当我使用 Excel 2003 将工作表导出为 CSV 时 它实际上使用分号 Col1 Col2 Col3 shfdh dfhdsfhd fdhsdfh dgsgsd hdfhd hdsfhdfsh 现在 当我使用 Mic
  • 比 O(n) 更好的范围交集算法?

    范围交集是一个简单但不平凡的问题 已经回答过两次了 查找数字范围交集 https stackoverflow com questions 224878 find number range intersection 比较日期范围 https
  • 如何正确离开临界区?

    我有以下 C 代码 我在其中使用临界区对象 https msdn microsoft com en us library windows desktop ms682530 v vs 85 aspx EnterCriticalSection