Semaphore/Critial 部分实施

Semaphore/Critial section implementation

我正在尝试了解互斥量、信号量和关键部分,但我不确定信号量的某些方面。信号量是否与临界区相同? semaphore.h 中关于如何使用信号量的定义指出使用是:

sem_t m;
sem_init(&m, 0, X); // initialize semaphore to X; what should X be?

sem_wait(&m);
// critical section here
sem_post(&m);

所以我的问题是“// 这里的临界区”真的是临界区吗?

信号量是用于保护临界区的工具:确保一次只执行一个 CS。

在您的示例中,第一个执行 sem_wait(&m) 的进程开始执行其临界区副本;任何其他试图执行其对应 sem_wait 的进程都将被阻止,直到第一个进程通过执行 sem_post 完成其 CS。那时,对 sem_wait 的其他一些调用将 return,再次开始该过程。