RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 586380
Accepted
NikBond
NikBond
Asked:2020-11-03 19:54:24 +0000 UTC2020-11-03 19:54:24 +0000 UTC 2020-11-03 19:54:24 +0000 UTC

互斥量如何确定锁定哪个对象?

  • 772

众所周知,

互斥锁的任务是保护对象不被占有互斥锁的线程以外的其他线程访问。在任何给定时刻,只有一个线程可以拥有受互斥体保护的对象。如果另一个线程需要访问受互斥锁保护的变量,则该线程将阻塞直到互斥锁被释放。

但是互斥体如何确定要阻塞的资源/对象/变量呢?毕竟,没有参数传递给它,它可以从中知道要保护什么。

std::mutex如果有的话,我们正在谈论c++11。

c++
  • 5 5 个回答
  • 10 Views

5 个回答

  • Voted
  1. Best Answer
    avp
    2020-11-03T22:01:10Z2020-11-03T22:01:10Z

    我将添加到@alexis031182 的回答中。

    互斥量或信号量,作为其概括(具体而言,位于某个地址的对象(变量))是一个或(在某些情况下)多个进程的代码流的同步点。

    仅此而已。它不保护任何东西。既不是内存中的对象,也不是代码段。不lock使用此互斥量调用操作的线程可以对任何变量和代码段做任何它想做的事情。保护是在逻辑级别(在开发人员的头脑中)执行的。

    事实上,调用lock指定互斥量操作的代码线程会递增与该互斥量关联的计数器,并在计数器为零时继续执行。

    否则,该线程一直等到计数器为 0(然后它会依次递增并继续运行),这会在有人调用unlock将计数器减 1 时发生。

    • 11
  2. KoVadim
    2020-11-03T20:02:44Z2020-11-03T20:02:44Z

    任何互斥锁都有函数lock和unlock(它们可以有不同的调用方式,但本质是不变的。有些互斥锁可以使用raii,自动调用必要的函数)。

    并且它保护了一段如果互斥量处于锁定状态则无法执行的代码。即一个mutex可以保护多个不同的地方,它们不会同时执行(与多线程执行有关)。另一方面,系统中可以同时存在多个互斥锁,互不干扰。

    • 10
  3. VladD
    2020-11-03T19:59:09Z2020-11-03T19:59:09Z

    其实也没办法。它不保护特定对象。

    互斥量仅确保对互斥量下的数据的访问被序列化。(也就是说,数据竞争是不可能的。)使用正确的对象的责任在于你,程序员。

    您所描述的并没有告诉您互斥锁的作用,只是它的用途以及您可以(自己)用它做什么。

    • 9
  4. Harry
    2020-11-03T21:04:13Z2020-11-03T21:04:13Z

    互斥锁本质上提供了所谓的“临界区”(critical section)——即 一次只能由一个线程执行的代码。

    但是如果这个互斥锁挂在访问某个变量的代码上,那么它似乎保护的是对象,而不是代码片段。

    • 7
  5. user177227
    2020-11-03T21:20:06Z2020-11-03T21:20:06Z

    请允许我打个比喻……谁起得早,谁就穿拖鞋。没有必要在他们身上标明这个事实。首先穿上 - 自己,你赢了。因此,谁没有时间,他迟到了,并且在释放这种有用但完全不可分割的资源之前,他将保持沮丧的期望。当然,这个例子在某种程度上有些牵强,因为现实生活中不排除武力解决的可能。但我们谈论的是互斥体,因此对财产再分配过程的无条件控制是不言而喻的。只有这次第一个成功的幸运者的善意,才会允许另一个人使用渴望得到安慰的对象。

    我会完成我自己。

    对于拖鞋,这个寓言是行不通的,因为许多人可以想象没有它们的工作生活。重点不在于拖鞋,而在于性能。通过互斥锁,一个线程的执行上下文锁定/释放另一个或其他线程的执行上下文。所以-是的,拖鞋与它无关,它在头上。

    “顺便说一句,达达尼昂:我听说巴豆的某个米洛做了惊人的事情。例如,他将一根绳子缠在头上,并用头部肌肉的一次运动 !!! ......将其撕裂。他一拳打倒了公牛,然后把他扛在肩上走了……好吧,诸如此类。我,当我发现这一切时......我在我的 Pierrefonds 里做了......好吧,一切都和这个 Milo 一样。除了一件事:我无法用头挣脱绳索。

    “那是因为你有力量……不是你的脑袋。

    • 3

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    如何停止编写糟糕的代码?

    • 3 个回答
  • Marko Smith

    onCreateView 方法重构

    • 1 个回答
  • Marko Smith

    通用还是非通用

    • 2 个回答
  • Marko Smith

    如何访问 jQuery 中的列

    • 1 个回答
  • Marko Smith

    *.tga 文件的组重命名(3620 个)

    • 1 个回答
  • Marko Smith

    内存分配列表C#

    • 1 个回答
  • Marko Smith

    常规赛适度贪婪

    • 1 个回答
  • Marko Smith

    如何制作自己的自动完成/自动更正?

    • 1 个回答
  • Marko Smith

    选择斐波那契数列

    • 2 个回答
  • Marko Smith

    所有 API 版本中的通用权限代码

    • 2 个回答
  • Martin Hope
    jfs *(星号)和 ** 双星号在 Python 中是什么意思? 2020-11-23 05:07:40 +0000 UTC
  • Martin Hope
    hwak 哪个孩子调用了父母的静态方法?还是不可能完成的任务? 2020-11-18 16:30:55 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    user207618 Codegolf——组合选择算法的实现 2020-10-23 18:46:29 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    Arch ArrayList 与 LinkedList 的区别? 2020-09-20 02:42:49 +0000 UTC
  • Martin Hope
    iluxa1810 哪个更正确使用:if () 或 try-catch? 2020-08-23 18:56:13 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5