用信号量解决同步问题
时间: 2023-07-31 19:06:19 浏览: 95
信号量是一种用于进程间同步及互斥的工具。它是一个计数器,用于控制多个进程对共享资源的访问。当一个进程需要访问共享资源时,它必须先获取信号量,然后才能访问该资源。当进程访问完共享资源后,它必须释放信号量,以便其他进程可以访问该资源。
在使用信号量解决同步问题时,通常需要定义两个信号量:一个用于表示资源的可用数量,另一个用于表示等待访问该资源的进程数量。
下面是使用信号量解决生产者-消费者问题的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUFFER_SIZE 10
int buffer[BUFFER_SIZE];
sem_t empty, full;
pthread_mutex_t mutex;
void *producer(void *arg) {
int item;
while (1) {
item = rand() % 100;
sem_wait(&empty);
pthread_mutex_lock(&mutex);
buffer[insert_index] = item;
insert_index = (insert_index + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&full);
}
}
void *consumer(void *arg) {
int item;
while (1) {
sem_wait(&full);
pthread_mutex_lock(&mutex);
item = buffer[remove_index];
remove_index = (remove_index + 1) % BUFFER_SIZE;
pthread_mutex_unlock(&mutex);
sem_post(&empty);
printf("Consumed item: %d\n", item);
}
}
int main() {
pthread_t producer_thread, consumer_thread;
sem_init(&empty, 0, BUFFER_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
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);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在这段代码中,使用了两个信号量 empty 和 full 分别表示缓冲区空闲数量和已占用数量。当生产者向缓冲区中插入数据时,需要先获取 empty 信号量,如果缓冲区已满,则阻塞等待;同时需要获取互斥锁 mutex,以保证对缓冲区的访问同步。当生产者插入数据后,需要释放互斥锁 mutex 和 full 信号量,以通知消费者有新的数据可用。
当消费者从缓冲区中取出数据时,需要获取 full 信号量,如果缓冲区为空,则阻塞等待;同时需要获取互斥锁 mutex,以保证对缓冲区的访问同步。当消费者取出数据后,需要释放互斥锁 mutex 和 empty 信号量,以通知生产者有新的空闲位置可用。
阅读全文