我正在研究多线程并试图理解信号量和互斥的概念。我在网上找到的大多数示例都使用某种库(例如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)
检查并将条件评估为真——这将创建一个竞争条件,其中两个线程都被授予同时访问同一内存区域的权限。
那么是什么阻止了这种竞争条件在现实世界的信号量实现中发生呢?