操作系统中的信号量分为哪几种,请简述其具体用法与功能,及实例代码
时间: 2023-12-08 19:06:17 浏览: 168
操作系统中的信号量分为二元信号量(Binary Semaphore)和计数信号量(Counting Semaphore)两种。
二元信号量:只有两种状态,通常是0和1,也可以是1和-1。当一个线程占用了这个信号量时,其他线程就不能再占用这个信号量,只有等到当前线程释放该信号量后,其他线程才能占用该信号量。常用于控制对共享资源的访问。
计数信号量:可以有多个状态,初始状态为一个整数N。当一个线程占用了这个信号量时,信号量的值减1,当信号量的值为0时,其他线程就不能再占用这个信号量,只有等到当前线程释放该信号量后,其他线程才能占用该信号量。常用于控制资源的可用数量。
以下是使用二元信号量和计数信号量的示例代码:
二元信号量:
```
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
sem_t sem;
void* func(void* args)
{
sem_wait(&sem);
printf("Thread %d enter.\n", *(int*)args);
sleep(2);
printf("Thread %d exit.\n", *(int*)args);
sem_post(&sem);
}
int main()
{
pthread_t tid[3];
int i, num[3] = {1, 2, 3};
sem_init(&sem, 0, 1);
for(i = 0; i < 3; i++)
{
pthread_create(&tid[i], NULL, func, &num[i]);
}
for(i = 0; i < 3; i++)
{
pthread_join(tid[i], NULL);
}
sem_destroy(&sem);
return 0;
}
```
计数信号量:
```
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
#include <semaphore.h>
sem_t sem;
void* func(void* args)
{
sem_wait(&sem);
printf("Thread %d enter.\n", *(int*)args);
sleep(2);
printf("Thread %d exit.\n", *(int*)args);
sem_post(&sem);
}
int main()
{
pthread_t tid[5];
int i, num[5] = {1, 2, 3, 4, 5};
sem_init(&sem, 0, 3);
for(i = 0; i < 5; i++)
{
pthread_create(&tid[i], NULL, func, &num[i]);
}
for(i = 0; i < 5; i++)
{
pthread_join(tid[i], NULL);
}
sem_destroy(&sem);
return 0;
}
```
以上示例代码中,主线程创建了多个子线程,这些子线程都需要访问共享资源,通过信号量来控制对共享资源的访问。在二元信号量的示例代码中,信号量的初始值为1,即只有一个线程能够访问共享资源,其他线程需要等待;在计数信号量的示例代码中,信号量的初始值为3,即最多有三个线程能够访问共享资源,其他线程需要等待。
阅读全文