三种纪录型信号量代码
时间: 2024-10-22 22:06:53 浏览: 17
FreeRTOS计数信号量示例代码
在操作系统中,信号量是一种同步机制,用于控制对共享资源的竞争访问。有三种常见的记录型信号量(也称为计数信号量):
1. **普通信号量(Binary Semaphore)**:
这是最基础的形式,它只有两个状态:0(未占用)和1(已占用)。当一个进程请求一个信号量并成功获取时,它的值会从1变为0;当另一个进程释放信号量时,值会从0变为1。
```c
sem_t binary_semaphore;
sem_init(&binary_semaphore, 0, 1); // 初始化为1,表示可用
// 请求和释放操作:
sem_wait(&binary_semaphore); // 如果当前为0,则阻塞,直到其他进程释放
sem_post(&binary_semaphore); // 当前进程释放,如果之前等待,唤醒队列的第一个进程
```
2. **计数信号量(Counting Semaphore)**:
它可以管理多个单位(通常是一个整数值),允许同时访问的进程数量超过一个。初始化时指定初始计数值。
```c
sem_t counting_semaphore;
sem_init(&counting_semaphore, 0, 5); // 初始化为5,表示最多5个进程可以同时访问
sem_wait(&counting_semaphore); // 阻塞,直到计数大于0
sem_post(&counting_semaphore); // 计数减一,唤醒一个进程
```
3. **自旋信号量(Spin Semaphore)**:
它与计数信号量类似,但在等待时不是挂起进程而是让其循环检查信号量值。这可能会导致CPU过度消耗,除非有明确的退出条件。
```c
void *spin_wait(sem_t *sem) {
while (semaphore_test_and_set(sem) == SEM_UNAVAILABLE);
// ...(处理信号量已可用的情况)
semaphore_reset(sem);
}
sem_t spin_semaphore;
sem_init(&spin_semaphore, PTHREAD_PROCESS_PRIVATE, 0);
spin_wait(&spin_semaphore); // 竞争资源,CPU繁忙循环
```
阅读全文