为什么使用互斥量而不是布尔变量进行线程同步?

2024-04-16

我正在尝试了解 C 中的多线程编程。

我有疑问,既然我们使用MUTEXES来进行线程同步,为什么我们不能使用布尔变量来阻塞要执行的代码的关键区域。

与布尔变量相比,静音变量有何特点?

PS:其实这个问题是在采访中问到的。 因此,请分享您对此的了解。


问题是两个线程可能同时看到布尔值可用,然后两个线程都会认为可以安全地继续。

例如,假设您有以下代码:

bool myLock = false;  // visible to all threads

void someFunction()
{
    if (!myLock)
    {
        myLock = true;
        // do whatever
        // and then release the lock
        mylock = false;
    }
}

现在,假设有两个线程正在执行。线程A读取myLock看到它是false,因此继续执行下一条指令。同时,线程B读取myLock看到它是false,因为线程 A 尚未将其设置为true。因此线程 B 继续前进并获得了锁。此时,两个线程都在执行应该受互斥锁保护的代码。

情况变得更糟,因为线程 A 完成了它正在做的事情并设置mylock回到false而线程 B 仍在执行。因此,即使线程 B 仍在其中,另一个线程也可以出现并获取锁。

互斥体保证原子性。也就是说,它保证检查和更新一次只能由一个线程完成。因此,如果您用互斥体替换布尔值,您将获得:

if (mutex.Acquire())
{
    // do stuff
    // then release the lock
    mutex.Release();
}

两个线程不可能同时获取互斥锁。

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

为什么使用互斥量而不是布尔变量进行线程同步? 的相关文章

  • Java中如何让另一个线程休眠

    我有一个扩展 Thread 的类 这个线程在运行时大部分时间都在睡眠 它会执行一个检查 如果 true 执行一个简单的操作 然后睡眠 1 2 秒并重复 该类还有一个由其他线程调用的公共方法 如果调用此函数 我希望线程在已经休眠的情况下休眠更
  • 使用线程和 ruby​​ mechanize 安全吗?

    有没有人见过很多这样的错误 Exception Net HTTPBadResponse at usr lib ruby 1 8 net http rb 2022 wrong status line SOME HTML CODE HERE 何
  • pthread_join() 中的阻塞

    根据手册页 pthread join 函数应暂停调用的执行 线程直到目标线程终止 除非目标线程 已经终止了 因此 据我了解 调用进程将阻塞 直到指定的线程退出 现在考虑以下代码 pthread t thrs NUMTHREADS for i
  • Timer 和 TimerTask - 如何从 TimerTask 运行中重新安排 Timer

    基本上我想做的是制作一个在 x 秒后运行特定 TimerTask 的计时器 但随后 TimerTask 可以重新安排计时器在 y 秒后执行任务 示例如下 它在我尝试在 TimerTask 运行中安排此任务的行上给出错误 线程 Timer 0
  • Java - 多线程代码在更多内核上运行速度并不更快

    我只是在 4 核机器上运行一些多线程代码 希望它比在单核机器上更快 想法是这样的 我有固定数量的线程 在我的例子中每个核心一个线程 每个线程执行一个Runnable形式 private static int data data shared
  • 今天 iCloud + Core Data(2015 年 7 月 10 日)

    几年前 Apple 发布了 Core Data 应用程序的 iCloud 同步 然后我发布了一个适用于 iPad iPhone MAC 的应用程序 其共享模型使用新的 Apple 机制 事情并没有按预期进行 同步机制有时不起作用 例如 就我
  • 线程与并行处理

    Microsoft NET 4 0 为其框架引入了新的 并行增强功能 我想知道使用标准 System Threading 函数与新的并行增强功能创建应用程序之间有什么区别 并行扩展和常规线程之间最重要的区别可能是控制流 一个线程 使用创建n
  • Python中的键盘可中断阻塞队列

    It seems import Queue Queue Queue get timeout 10 键盘可中断 ctrl c 而 import Queue Queue Queue get 不是 我总是可以创建一个循环 import Queue
  • python中跨模块和线程的全局变量

    我有一个配置文件 config py 它包含一个全局变量 即在 config py 中我有 5 是默认值 config py globalVar 5 现在 在模块 run py 中 我设置全局变量 然后调用打印函数 run py impor
  • 如何安排函数在 Qt for Python 的主 UI 线程上运行?

    我正在移植一个 Python GTK 应用程序 因此它使用 Qt for Python PySide2 它使用Python标准实现工作线程threading模块和工作线程使用Gdk threads add idle 与主 GUI 线程交互
  • 让线程休眠的更好方法

    我一直在编写有关 Java 8 中 2D 图形的教程 当时 NetBeans 给了我一个提示 Thread Sleep会影响性能 然而 尽管我已经找到了几种更好的方法 但我还没有找到一种方法来包含它们而不弄乱代码 package platf
  • 在 Perl 中,如何从父进程向子进程发送消息(或信号),反之亦然?

    我正在编写一个管理多进程的程序 这就是我所做的 而且效果很好 但现在 我想将消息从子进程发送到父进程 反之亦然 从父进程到子进程 你知道最好的方法吗 你知道我所做的是否是我想要的正确方法 从子进程到父进程发送消息 信号或共享内存 反之亦然
  • OpenMP 动态调度与引导调度

    我正在研究 OpenMP 的调度 特别是不同的类型 我了解每种类型的一般行为 但澄清一下何时进行选择会很有帮助dynamic and guided调度 英特尔的文档 https software intel com en us articl
  • 内核如何区分线程和进程

    Linux 中的线程被称为轻量级进程 无论是进程还是线程 它们的实现都是通过task struct数据结构 1 gt 那么 从这个意义上说 内核如何区分线程和进程 2 gt 当发生上下文切换时 线程如何在上下文切换中获得更少的开销 因为在此
  • 如何将异步函数传递给 Python 中的线程目标?

    我有以下代码 async some callback args await some function 我需要将它作为目标传递给线程 thread threading Thread target some callback args som
  • 从后台线程更新可观察列表的正确方法

    我正在尝试遵循 MVC 进行测试项目 因此我的模型应该完全独立于我的观点 但是我不确定应该如何更新在后台线程中更新的可观察列表 正在给出有关上传的字符串 文件 以便消息显示在 UI 上的 ListView 中 我正在使用 JavaFX 并尝
  • 调用“DisplayManagerGlobal.getDisplayInfo()”会导致应用程序中的应用程序无响应 (ANR)

    显然 应用程序中的某些内容从不同线程 主线程和绑定器线程 调用该方法 这会导致内部 ANR 它经常发生 我不知道它发生在哪里 因为我无法在模拟器或我拥有的测试设备上重现它 该应用程序的作用 它是一个应用程序储物柜应用程序 它在应用程序覆盖层
  • 通知另一个线程数据可用的最快方法是什么?有什么替代旋转的方法吗?

    我的一个线程将数据写入循环缓冲区 另一个线程需要尽快处理该数据 我本来想写这么简单的spin 伪代码 while true while a i do nothing just keep checking over and over proc
  • Python多线程模型

    我已经研究 python 中的多线程有一段时间了 但是我对一些问题感到困惑 首先 python线程库创建的线程是用户级线程还是内核级线程 书上说用户级线程必须映射到内核线程并且 操作系统仅创建和维护内核级线程 python中将使用哪种线程模
  • 如何在 Android 上从后台线程显示 Toast?

    我怎样才能显示Toast http developer android com guide topics ui notifiers toasts html来自线程的消息 您可以通过调用Activity s runOnUiThread您线程中

随机推荐

  • dos2unix 不转换 ^M

    我从 Windows 7 上运行的程序将结果导出到文本文件中 并在 Xubuntu 14 04 上复制该文件 在终端中 我跑了dos2unix file txt 这告诉我converting file out mapqtl txt to U
  • 使用 UDF 的 DataFrame 给出任务不可序列化异常

    尝试在数据帧上使用 show 方法 它给出了任务不可序列化异常 我尝试扩展可序列化对象 但错误仍然存 在 object App extends Serializable def main args Array String Unit Log
  • 在android中点击键盘的完成按钮时将数据插入数据库

    我想知道在将数据插入数据库时 按下键盘 完成 按钮时到底应该做什么 我在这里使用多个编辑文本 当谈到最后一个编辑按钮时 我必须将所有数据插入数据库 private static final String CREATE DB TABLE BU
  • opencv VideoCapture.设置灰度?

    我会避免将摄像机拍摄的每一帧转换为cvtColor frame image CV RGB2GRAY 有没有办法设置VideoCapture直接进入灰度 Example VideoCapture cap 0 cap set CV CAP PR
  • 如何获取从标准 UIViewController 中调用的 UIWebView 的 UIScrollView 委托方法?

    所以我只有一个标准的 UIViewController 其中有一个显示 pdf 的 UIWebView 对于应用程序功能 我需要能够响应 UIWebView 的嵌套 UIScrollView 事件 例如scrollViewWillBegin
  • 使用 Hive 自定义输入格式

    Update 好吧 事实证明以下不起作用的原因是因为我使用的是较新版本的InputFormat API import org apache hadoop mapred这是旧的与import org apache hadoop mapredu
  • 跳出选择循环?

    我正在尝试使用select在循环中接收消息或超时信号 如果收到超时信号 则循环应中止 package main import fmt time func main done time After 1 time Millisecond num
  • Android 使用前置摄像头拍照

    这是我第一次使用相机 我已经阅读了很多示例和文档 所以我尝试创建自己的类来使用前置摄像头拍照 这就是我想出的 public class CameraController private Context context private boo
  • 如何使用 Active Support 核心扩展

    我安装了 Active Support 3 0 3 和 Rails 3 0 3 with Ruby 1 8 7 当我尝试使用时1 week ago I get NoMethodError undefined method week for
  • 是否可以针对 noSQL DB 构建复杂的查询

    我一直在研究 noSQL DB 但未能为自己满意地回答这个问题 是否可以针对 noSQL DB 构建复杂的查询 我想知道的查询类型是这样的 select from DB where vara gt x AND varb 2 AND varc
  • 无法添加日期选择器选项?

    我有一个表单 它动态创建一个带有几个表单输入的新行 其中一个输入附有一个日期选择器 我刚刚在这里的帮助下成功完成了这项工作 除了还剩下一个问题 当我想向日期选择器添加选项时 它就会停止工作 工作小提琴 http jsfiddle net H
  • 无法使字段“属性”可访问;更改其可见性或为其声明类型 gSON fromJson 编写自定义 TypeAdapter

    我有一个名为游戏的课程 public class Game private String name private int id private GameFields gameFields Expose deserialize false
  • Clang 标志的完整列表

    在哪里可以找到 Clang 标志的完整列表 有一些 比如 include pch 这似乎没有在手册页中列出 我知道 GCC 使用一些相同的标志 但它不包括类似的文档 Os我相信这仅在 Clang 中可用 是否有地方可以找到所有 Clang
  • 使用 R 中的 drc 包回归​​多个剂量反应曲线

    我试图通过我的实验数据拟合回归 4 或 5 PL 我有几种化合物可以抑制我感兴趣的酶 每个都有其自己的 0 100 酶活性范围 所有数据都在一个数据框中 并通过指定我的化合物 毒素 的一列进行区分 因此 我想对每种毒素 化合物分别进行回归
  • VS2015:应用程序无法正确启动(0xc000007b)

    我在 Visual Studio 2015 上为 Windows 10 PC 编写了代码 该应用程序主要关注 UDP 通信 我使用 boost 库 它工作正常 但当我将代码文件夹移至 Windows 7 时 我收到错误 应用程序无法正确启动
  • SwiftUI View 协议中的EnvironmentObject

    我想制定这样的协议 protocol SubscriptionManagerView View var subscriptionManager EnvironmentObject
  • python装饰器,嵌套函数[重复]

    这个问题在这里已经有答案了 我试图弄清楚为什么在使用装饰器时我需要一个嵌套函数 这是一个例子 def func f def deco args kwargs return f args kwargs return deco func def
  • Numpy/ Pandas/ Matplotlib 安装时间太长

    我已经决定安装 MacOs Big Sur 现在我必须再次重新安装所有软件包 但我遇到了一些问题 我没有太多使用终端的经验 但安装一些数据科学库需要很长时间 例如 安装 numpy 花了几分钟 而现在 自从我开始尝试安装 pandas li
  • 在 Jade 中使用 HTML 被认为是不好的做法吗?

    Jade 看起来像一个很酷的模板引擎 我想我将在下一个项目中使用它 然而 有些语法对我来说没有意义 这样做你会得到什么 ul li a href book a Book A 代替 ul li a href book a Book A a l
  • 为什么使用互斥量而不是布尔变量进行线程同步?

    我正在尝试了解 C 中的多线程编程 我有疑问 既然我们使用MUTEXES来进行线程同步 为什么我们不能使用布尔变量来阻塞要执行的代码的关键区域 与布尔变量相比 静音变量有何特点 PS 其实这个问题是在采访中问到的 因此 请分享您对此的了解