c语言线程中使用信号量,给个示例
时间: 2023-05-23 19:01:06 浏览: 210
c语言信号量的使用实例
3星 · 编辑精心推荐
好的,下面是一个 C 语言线程中使用信号量的示例代码:
```
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define MAX 10
sem_t sem_empty; // 信号量,表示空的缓冲区数量
sem_t sem_full; // 信号量,表示满的缓冲区数量
int buffer[MAX]; // 缓冲区
int in = 0; // 在缓存区里插入的位置
int out = 0; // 从缓存区里取出的位置
void *producer(void *args)
{
int i;
for (i = 0; i < 100; i++)
{
sem_wait(&sem_empty); // 取空槽位上锁
buffer[in] = i; // 生产一个物品
in = (in + 1) % MAX; // 插入位置循环移动
sem_post(&sem_full); // 解锁满槽位
}
pthread_exit(NULL);
}
void *consumer(void *args)
{
int i, data;
for (i = 0; i < 100; i++)
{
sem_wait(&sem_full); // 取满槽位上锁
data = buffer[out]; // 取出一个物品
out = (out + 1) % MAX; // 取出位置循环移动
sem_post(&sem_empty); // 解锁空槽位
printf("%d\n", data); // 处理当前物品
}
pthread_exit(NULL);
}
int main()
{
pthread_t producer_thread, consumer_thread;
sem_init(&sem_empty, 0, MAX); // 初始化信号量
sem_init(&sem_full, 0, 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(&sem_empty); // 销毁信号量
sem_destroy(&sem_full); // 销毁信号量
return 0;
}
```
这是一个使用信号量来实现线程间同步的简单的生产者消费者模型的例子。其中,我们通过使用两个信号量来控制缓冲区中物品的数量,当缓冲区满了时,生产者会等待消费者来消费物品,而当缓冲区为空时,消费者会等待生产者来生产物品。这样就可以保证生产者和消费者之间的同步和互斥,避免了竞态条件。
阅读全文