gpt4 book ai didi

c - 信号量操作

转载 作者:太空宇宙 更新时间:2023-11-03 23:31:41 24 4
gpt4 key购买 nike

我正在阅读有关信号量及其操作的文本。作者强调信号量的wait()post()操作应该原子执行,否则可能违反线程互斥。任何人都可以向我解释他的意思吗?顺便说一句,我是多线程的新手

最佳答案

上下文切换的操作,其中一个任务/进程由内核替换为另一个任务/进程是异步和不确定的。

让我们检查以下代码:

x++;

看起来很简单,哈?但是,如果 x 在不同的任务/进程之间共享,则此代码容易出现同步错误。

要理解这一点,您必须理解原子操作的概念。

原子操作是处理器可以在单个时钟上执行的指令。通常涉及读寄存器、写寄存器等。

回到代码示例:递增变量时在幕后(程序集)实际发生的是cpu 将变量的值读入寄存器。然后,它增加它。然后将其保存回原来的位置(内存)。

如您所见,像这样的简单操作涉及 3 个 cpu 步骤。上下文切换可以发生在这 3 个步骤之间。

让我们举个例子,两个线程需要递增同一个变量 x。

让我们检查一个想象的(但可能的)场景的伪汇编代码

  1. 读取要注册的值(线程1)
  2. 增加值(线程 1)上下文切换
  3. 读取要注册的值(线程2)
  4. 增加值(线程 2)
  5. 保存值(线程 2)上下文切换
  6. 保存值(线程 1)

如果 x 是 3,现在看来它需要是 5,但它会是 4。

现在,让我们引用您的原始问题。信号量/互斥量实际上是一个变量。当进程想要获取它时,它会递增它。

关于c - 信号量操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005262/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com