跳转到主内容
极星编程网:以代码为星,赴技术山海!

怎么用 sem_wait 和 sem_post 控制共享资源访问?

大家好,我是苏承栈,今天咱们来聊聊 sem_wait 和 sem_post 这两个在 POSIX 信号量(semaphores)操作中的关键函数。

在编程中,我们经常需要控制对共享资源的访问,避免数据竞争和并发问题。而 Sem 类中的 sem_wait 和 sem_post 就是用来实现这一功能的。

sem_wait 的作用

sem_wait(&_sem); 这个函数的作用是等待信号量 _sem 的值变为非零。简单来说,就是等待一个信号量单位“可用”。如果信号量的值大于零,它会将值减一,然后立即返回;如果信号量的值为零,它会阻塞调用线程,直到信号量的值变为非零。

这就像是一个停车场,每个停车位代表一个信号量单位。当停车位(信号量值)大于零时,车辆(线程)可以进入;当停车位为零时,车辆必须等待,直到有停车位空出来。

sem_post 的作用

sem_post(&_sem); 这个函数的作用是增加信号量 _sem 的值。它会使信号量的值加一,并唤醒一个或多个等待该信号量的线程(如果有的话)。

这就像是将一个停车位从停车场中释放出来,让等待的车辆可以进入。

下面是一个简单的示例,展示了如何使用这两个函数来控制对共享资源的访问:

sem_t _sem;
sem_init(&_sem, 0, 1); // 初始化信号量,值为1

// 线程 A
sem_wait(&_sem); // 等待信号量
// 访问共享资源
sem_post(&_sem); // 释放信号量

// 线程 B
sem_wait(&_sem); // 等待信号量
// 访问共享资源
sem_post(&_sem); // 释放信号量

通过这种方式,我们可以确保在任何时候只有一个线程可以访问共享资源,避免了数据竞争和并发问题。

最后,如果你对并发编程和信号量还有更多疑问,欢迎访问我们的网站 极星编程网,了解更多精彩内容。

我是苏承栈,我们下期再见!

相关文章