面试题答案
一键面试信号量机制基本原理
信号量(Semaphore)是一个整型变量,通过一个计数器控制对共享资源的访问。它有一个计数值,当进程请求访问共享资源时,信号量计数值减1;当进程释放共享资源时,信号量计数值加1。如果计数值为0,表示共享资源已被占用,请求的进程需要等待。
使用信号量实现进程同步示例(以生产 - 消费模型为例)
假设在C语言环境下,使用POSIX信号量实现。
- 引入头文件
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
- 定义信号量和共享数据
sem_t empty; // 表示缓冲区是否为空的信号量
sem_t full; // 表示缓冲区是否有数据的信号量
int buffer; // 共享缓冲区
- 生产者函数
void* producer(void* arg) {
for (int i = 0; i < 5; i++) {
sem_wait(&empty); // 等待缓冲区为空
buffer = i;
printf("Produced: %d\n", buffer);
sem_post(&full); // 通知缓冲区有数据
}
return NULL;
}
- 消费者函数
void* consumer(void* arg) {
for (int i = 0; i < 5; i++) {
sem_wait(&full); // 等待缓冲区有数据
printf("Consumed: %d\n", buffer);
sem_post(&empty); // 通知缓冲区为空
}
return NULL;
}
- 主函数
int main() {
pthread_t producer_thread, consumer_thread;
sem_init(&empty, 0, 1); // 初始化empty信号量,初始值为1,即缓冲区初始为空
sem_init(&full, 0, 0); // 初始化full信号量,初始值为0,即缓冲区初始无数据
pthread_create(&producer_thread, NULL, producer, NULL);
pthread_create(&consumer_thread, NULL, consumer, NULL);
pthread_join(producer_thread, NULL);
pthread_join(consumer_thread, NULL);
sem_destroy(&empty);
sem_destroy(&full);
return 0;
}
在上述代码中,producer
函数生产数据放入共享缓冲区,consumer
函数从共享缓冲区取出数据。empty
信号量用于控制生产者何时可以向缓冲区写入数据(缓冲区为空时),full
信号量用于控制消费者何时可以从缓冲区读取数据(缓冲区有数据时)。通过这两个信号量的协调,实现了生产者和消费者进程之间的同步。