增强named_mutex和remove()命令

2023-11-27

我有一个可以由多个线程创建的类。但在一个函数中,代码需要受到保护,因此我决定使用 boost 进程间互斥体。每个类在其构造函数中创建或打开相同的互斥体:

MyClass::MyClass()
{
       boost::interprocess::named_mutex m_Lock(
                 boost::interprocess::open_or_create, "myLock" );
}

现在到了调用关键代码部分的时候了:

int MyClass::MyFunction()
{
       boost::interprocess::scoped_lock<boost::interprocess::named_mutex> lock(
                  m_Lock, boost::interprocess::try_to_lock);
       if(!lock)
       {
           return -1;
       }
       // else do some stuff here 
}

为了在函数之后进行清理(就像 boost 页面上描述的那样),我在类析构函数中使用了删除命令:

MyClass::~MyClass()
{
       boost::interprocess::named_mutex::remove("myLock");
}

实际上所有这些代码都工作正常,但我有一个问题:

正如删除命令的描述中所述:

从系统中删除指定的互斥体。出错时返回 false。从不抛出。

因此,这意味着删除命令只是将互斥锁从系统中删除 - 即使另一个线程刚刚锁定了它(我已经尝试过这种情况 - 它不再被锁定)。 所以我的问题如下: 例如,我有 3 个线程( A、B 和 C ) - 现在会发生以下情况:

  1. 进程A创建该类的实例,调用该函数并锁定它
  2. 进程 B 创建该类的实例,调用该函数但无法访问代码(然后等待,例如)
  3. 进程 A 完成受保护的代码并解锁
  4. 进程 B 获得对受保护代码的访问权限并将其锁定
  5. 进程A删除类的实例->调用remove命令
  6. 进程 C 创建类的实例,调用函数并可以访问代码,因为删除命令删除了互斥体 --> 错误!

所以现在有人可能会说“那就不要调用删除!” - 那么这可能吗?我的意思是,由于named_mutex写入系统,我怀疑它会在没有显式调用的情况下被删除,即使程序结束也是如此。 有人有帮助吗?


来自增强文档, the remove打电话,是不必要的。的析构函数named_mutex将自动向操作系统表明该进程不再需要该资源。您可能只需要依靠析构函数的内置行为进行清理就可以了。

如果显式调用remove,则可能会导致尝试使用指定互斥体的任何其他进程或线程对该互斥体的任何操作失败。根据您的使用安排方式,这可能会导致数据争用或在其他进程中引发崩溃/异常。

〜named_mutex();

销毁*this并表明调用过程完成 使用该资源。析构函数将释放任何系统 系统为此进程分配的资源 资源。资源仍然可以通过调用 open 再次打开 构造函数重载。要从系统中删除资源,请使用 消除()。

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

增强named_mutex和remove()命令 的相关文章

  • 如何在MVVM中管理多个窗口

    我知道有几个与此类似的问题 但我还没有找到明确的答案 我正在尝试深入研究 MVVM 并尽可能保持纯粹 但不确定如何在坚持模式的同时启动 关闭窗口 我最初的想法是向 ViewModel 发送数据绑定命令 触发代码来启动一个新视图 然后通过 X
  • 将复选框添加到 UniformGrid

    我正在尝试将复选框动态添加到 wpf 中的统一网格中 但看起来网格没有为它们分配足够的空间 所以它们都有点互相重叠 这就是我将它们添加到后面的代码中的方法 foreach string folder in subfolders PathCh
  • 如何检查图像对象与资源中的图像对象是否相同?

    所以我试图创建一个简单的程序 只需在单击图片框中更改图片即可 我目前只使用两张图片 所以我的图片框单击事件函数的代码 看起来像这样 private void pictureBox1 Click object sender EventArgs
  • 如何使 Windows 窗体的关闭按钮不关闭窗体但使其不可见?

    该表单有一个 NotifyIcon 对象 当用户单击 关闭 按钮时 我希望表单不关闭而是变得不可见 然后 如果用户想再次查看该表单 可以双击系统托盘中的图标 如果用户想关闭表单 可以右键单击该图标并选择 关闭 有人可以告诉我如何使关闭按钮不
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • 是否可以强制 XMLWriter 将元素写入单引号中?

    这是我的代码 var ptFirstName tboxFirstName Text writer WriteAttributeString first ptFirstName 请注意 即使我使用 ptFirstName 也会以双引号结束 p
  • 如何忽略“有符号和无符号整数表达式之间的比较”?

    谁能告诉我必须使用哪个标志才能使 gcc 忽略 有符号和无符号整数表达式之间的比较 警告消息 gcc Wno sign compare 但你确实应该修复它警告你的比较
  • 将目录压缩为单个文件的方法有哪些

    不知道怎么问 所以我会解释一下情况 我需要存储一些压缩文件 最初的想法是创建一个文件夹并存储所需数量的压缩文件 并创建一个文件来保存有关每个压缩文件的数据 但是 我不被允许创建许多文件 只能有一个 我决定创建一个压缩文件 其中包含有关进一步
  • WPF TabControl,用C#代码更改TabItem的背景颜色

    嗨 我认为这是一个初学者的问题 我搜索了所有相关问题 但所有这些都由 xaml 回答 但是 我需要的是后台代码 我有一个 TabControl 我需要设置其项目的背景颜色 我需要在选择 取消选择和悬停时为项目设置不同的颜色 非常感谢你的帮助
  • Qt moc 在头文件中实现?

    是否可以告诉 Qt MOC 我想声明该类并在单个文件中实现它 而不是将它们拆分为 h 和 cpp 文件 如果要在 cpp 文件中声明并实现 QObject 子类 则必须手动包含 moc 文件 例如 文件main cpp struct Sub
  • 在 ASP.NET Core 3.1 中使用包含“System.Web.HttpContext”的旧项目

    我们有一些用 Net Framework编写的遗留项目 应该由由ASP NET Core3 1编写的API项目使用 问题是这些遗留项目正在使用 System Web HttpContext 您知道它不再存在于 net core 中 现在我们
  • vector 超出范围后不清除内存

    我遇到了以下问题 我不确定我是否错了或者它是一个非常奇怪的错误 我填充了一个巨大的字符串数组 并希望在某个点将其清除 这是一个最小的例子 include
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • 当操作繁忙时,表单不执行任何操作(冻结)

    我有一个使用 C 的 WinForms 应用程序 我尝试从文件中读取一些数据并将其插入数据表中 当此操作很忙时 我的表单冻结并且无法移动它 有谁知道我该如何解决这个问题 这可能是因为您在 UI 线程上执行了操作 将文件和数据库操作移至另一个
  • 实体框架 4 DB 优先依赖注入?

    我更喜欢创建自己的数据库 设置索引 唯一约束等 使用 edmx 实体框架设计器 从数据库生成域模型是轻而易举的事 现在我有兴趣使用依赖注入来设置一些存储库 我查看了 StackOverflow 上的一些文章和帖子 似乎重点关注代码优先方法
  • C++ fmt 库,仅使用格式说明符格式化单个参数

    使用 C fmt 库 并给定一个裸格式说明符 有没有办法使用它来格式化单个参数 example std string str magic format 2f 1 23 current method template
  • 控制到达非 void 函数末尾 -wreturn-type

    这是查找四个数字中的最大值的代码 include
  • mysql-connector-c++ - “get_driver_instance”不是“sql::mysql”的成员

    我是 C 的初学者 我认为学习的唯一方法就是接触一些代码 我正在尝试构建一个连接到 mysql 数据库的程序 我在 Linux 上使用 g 没有想法 我运行 make 这是我的错误 hello cpp 38 error get driver
  • C 中的异或运算符

    在进行按位操作时 我在确定何时使用 XOR 运算符时遇到一些困难 按位与和或非常简单 当您想要屏蔽位时 请使用按位 AND 常见用例是 IP 寻址和子网掩码 当您想要打开位时 请使用包含或 然而 XOR 总是让我明白 我觉得如果在面试中被问
  • 防止索引超出范围错误

    我想编写对某些条件的检查 而不必使用 try catch 并且我想避免出现 Index Out of Range 错误的可能性 if array Element 0 Object Length gt 0 array Element 1 Ob

随机推荐

  • Jquery UI 可拖动不会调整其他 DIV 的大小

    在这嘭嘭嘭我有三个DIVs 除以另外两个DIV可拖动的 灰色 当可拖动时DIVs 向上 向下或向左 向右拖动 其他DIVs 应该调整大小 第一个可拖动 DIV 工作正常 左侧的 DIV 可以垂直调整其他 DIV 的大小 但第二个可拖动DIV
  • 如何在 SQL Server 非标准架构表上使用 dplyr tbl

    我的问题是我该如何使用dplyr函数 例如tbl 在不使用默认 dbo 架构的 SQL Server 表上 为了获得更多上下文 我尝试将此处给出的 R 数据库示例应用到我自己的表中 https db rstudio com 向下滚动到标题为
  • git Remote prune、git prune、git fetch --prune 等有什么区别

    我的情况是这样的 在同一个存储库上工作的人已经从他的本地和远程存储库中删除了一个分支 大多数在 Stack Overflow 或其他网站上询问此类问题的人都会遇到分支问题仍然显示在远程跟踪分支列表中的问题git branch a在底部 ma
  • 按 IN 序列对 MySQL 结果排序?

    当我使用 IN 从表中选择一组行时 例如 SELECT x y x z FROM x WHERE x id IN 23 55 44 12 有没有 SQL 技巧可以让它们按照 IN 集中给定的顺序返回 因此 在示例中 假设 x 具有 id 为
  • 垂直居中响应式 iframe

    我正在使用该技术此处描述使 iframe 视频 响应 本质上 iframe 绝对定位在宽度为 100 的包装元素内 包装元素根据视频的宽高比设置填充 embed responsive position relative video heig
  • $ 在 Haskell 中意味着什么/做什么?

    当您编写稍微复杂的函数时 我注意到 用得很多 但我不知道它的作用是什么 是中缀 应用程序 它定义为 a gt b gt a gt b f x f x or f x f x or id 它对于避免额外的括号很有用 f g x f g x 它的
  • 检查字符串是否是字符串列表中的子字符串的最快方法

    我有一个包含 4000 个不同名字的静态列表 因此列表的长度很大 4000 但每个字符串大约有 4 到 12 个字符 它们是名字 然后 我有一个从数据库检索到的 10000 个字符串的动态列表 这些字符串可能具有任意长度 我需要针对 100
  • 为什么 Window.FindName() 没有发现子 UserControl 中按钮的 x:Name?又名名称范围如何工作?

    因此 在下面的示例代码中 我创建了一个 UserControl UserControldChild 它是主窗口 Window1 xaml 的子窗口 为什么FindName 方法在下面的代码中找不到 myButton 这一定与WPF XAML
  • 在 Rails 应用程序中记录 RestClient

    我想调试我的 Rails 应用程序发出的请求休息客户端 RestClient 文档说 要启用日志记录 您可以 使用 ruby Logger 设置 RestClient log 或者设置一个环境变量以避免修改代码 在这种情况下 您可以使用文件
  • UUID 有多独特?

    使用 UUID 唯一标识某些内容 我将其用于上传到服务器的文件 有多安全 据我了解 它是基于随机数的 然而 在我看来 只要有足够的时间 它最终会重演 纯粹是偶然 是否有更好的系统或某种类型的模式来缓解这个问题 非常安全 the annual
  • Java(Android)中自动检测文本的语言[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 对于我的应用程序 我希望给定一个文本 检测其语言 例如 ISO 代码和机会 我想知道是否有某种网络服务或java库可以这样做 提前致谢 使用二元分析
  • movl $_start, %eax 是什么意思?

    后面跟一个标识符是什么意思 x86 汇编 AT T 语法 在 AT T 语法中 意味着将后面的内容视为立即常量而不是内存地址 换句话说 movl start eax 加载符号的地址 start进入 eax movl start eax 从内
  • 如何为 python 获取 PIP [重复]

    这个问题在这里已经有答案了 我正在尝试安装 pip py 每当我搜索安装程序时 它都会打开一个新选项卡 其中包含代码 但我无法下载任何内容 我打算做什么 我打算将代码复制粘贴到Python解释器中吗 如何让它适用于 Windows 7 32
  • 在 Python 2.7 中从数字列表中删除一组索引的最有效方法是什么?

    所以我想知道如何使用 Python 2 7 最有效地获取用于表示索引的值列表 如下所示 但长度最多为 250 000 indices 2 4 5 并从更大的列表中删除该索引列表 如下所示 3 000 000 项 numbers 2 6 12
  • 如何在Linux上高效监控目录变化?

    我正在使用 Magento 有一个功能可以将 CSS 和 Javascript 合并到一个大文件中 不管其优点和缺点 都存在以下问题 最终文件会在多个级别进行缓存 包括但不限于 亚马逊云前 代理服务器 客户端浏览器缓存 Magento 使用
  • Aurelia 语义下拉菜单

    我正在尝试在 Aurelia 中使用组合框 以便我的用户可以输入下拉列表并搜索内容 我试图合并 Semantic 创建的下拉菜单 但是当我在元素上调用下拉菜单时 它不会运行代码 因此它仍然是一个正常的下拉菜单 就像这里的状态示例一样 htt
  • R 从面板中删除行,同时保持面板平衡

    有没有一种优雅的方法来平衡不平衡的面板数据集 我想从一个不平衡的面板 即 有些人丢失了一些数据 开始 最后得到一个平衡的面板 即 所有的人都没有丢失任何数据 下面是一些示例代码 正确的最终结果是保留对 Frank 和 Edward 的所有观
  • 如何从 Blazor 服务器端下载内存中文件

    有没有办法下载动态生成的文件在记忆中 in Blazor 服务器端不需要将其存储在文件系统上 解决方案是添加Web Api控制器到 Blazor 服务器端应用程序中 Add Controllers DownloadController cs
  • Android TabHost 上的徽章

    我想实现与 iPhone 中相同的功能 我在底部栏中实现了与 iPhone 中相同的自定义 Tabhost 我可以设置 正常 选定状态的两个图标 但我需要带有数量的动态图标 通知如图片所示 Thanks Android ViewBadger
  • 增强named_mutex和remove()命令

    我有一个可以由多个线程创建的类 但在一个函数中 代码需要受到保护 因此我决定使用 boost 进程间互斥体 每个类在其构造函数中创建或打开相同的互斥体 MyClass MyClass boost interprocess named mut