gpt4 book ai didi

c - 检查信号量值时是什么阻止了竞争条件?

转载 作者:太空宇宙 更新时间:2023-11-04 00:39:10 24 4
gpt4 key购买 nike

我正在研究多线程并试图理解信号量互斥 的概念。我在网上找到的大多数示例都使用某种库(例如 pthread)来实现信号量或互斥量,但我更感兴趣的是实现一个建立临界区的简单信号量——访问特定内存区域的线程不超过一个。

对于这个任务,我相信我需要一个互斥量(如果我正确理解术语的话,也称为二进制信号量)。我可以看到信号量如何通过将代码部分“锁定”到单个线程来防止竞争条件,但是什么可以防止竞争条件发生在信号量本身?

我想象一个二进制信号量来保存一个 int 值来跟踪锁:

Semaphore
---------
int lock = 1;

unsigned P(void){
if(lock > 0){
lock--;
return 0; /* success */
}
return 1; /* fail */
}

void V(void){
lock++;
}

假设两个线程同时调用P函数,它们都同时到达if(lock > 0)检查并评估条件为< strong>true -- 这会创建一个竞争条件,其中两个线程都被授予同时访问同一内存区域的权限。

那么是什么阻止了这种竞争条件在信号量的现实世界实现中发生?

最佳答案

锁定和释放信号量和/或互斥量作为原子操作发生,这意味着CPU不能从当前进程中退出。这确保了一旦互斥锁启动(它由一个或几个 CPU 指令(微码)组成),进程将保持 CPU 直到锁定/释放完成。
也有不同的方法来实现线程,可以是 CPU(内核空间)的直接支持,也可以是通过用户空间中的库(例如 pthreads)。


来自 OSDev.org

原子操作是一种将始终在没有任何其他进程能够读取或更改操作期间读取或更改的状态的情况下执行的操作。它作为一个步骤有效地执行,并且是许多处理多个独立进程的算法中的重要质量,无论是在同步还是在不需要同步的情况下更新共享数据的算法中。


Here也是一篇关于原子性的好文章(尽管是在 Delphi 中)。

关于c - 检查信号量值时是什么阻止了竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16170249/

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