操作系统信号量
在并发编程中,多个线程或进程可能会同时访问共享资源,从而导致竞争条件(Race Condition)。为了避免这种情况,操作系统引入了**信号量(Semaphore)**机制。信号量是一种用于控制多个线程或进程对共享资源访问的同步工具。
什么是信号量?
信号量是一个整型变量,通常用于管理对共享资源的访问。它支持两种基本操作:
- P操作(等待操作):尝试获取资源,如果信号量的值大于0,则将其减1;否则,线程或进程会被阻塞,直到信号量的值大于0。
- V操作(释放操作):释放资源,将信号量的值加1,并唤醒等待的线程或进程。
信号量可以分为两种类型:
- 二进制信号量:值只能是0或1,通常用于实现互斥锁。
- 计数信号量:值可以是任意非负整数,用于控制多个资源的访问。
信号量的工作原理
信号量的核心思想是通过原子操作(不可分割的操作)来确保对共享资源的访问是线程安全的。以下是一个简单的信号量实现示例:
#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>
sem_t semaphore;
void* thread_func(void* arg) {
sem_wait(&semaphore); // P操作
printf("Thread %ld is accessing the shared resource.\n", (long)arg);
sleep(1); // 模拟资源使用
printf("Thread %ld is releasing the shared resource.\n", (long)arg);
sem_post(&semaphore); // V操作
return NULL;
}
int main() {
pthread_t threads[5];
sem_init(&semaphore, 0, 1); // 初始化信号量,初始值为1
for (long i = 0; i < 5; i++) {
pthread_create(&threads[i], NULL, thread_func, (void*)i);
}
for (int i = 0; i < 5; i++) {
pthread_join(threads[i], NULL);
}
sem_destroy(&semaphore); // 销毁信号量
return 0;
}
输出示例:
Thread 0 is accessing the shared resource.
Thread 0 is releasing the shared resource.
Thread 1 is accessing the shared resource.
Thread 1 is releasing the shared resource.
...
在这个例子中,信号量的初始值为1,表示只有一个线程可以访问共享资源。其他线程必须等待当前线程释放资源后才能继续。