使用C语言写能在linux环境下运行
时间: 2024-03-26 07:40:00 浏览: 63
下面是一个在Linux环境下运行的生产者消费者问题的代码,使用C语言实现:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
#define BUF_SIZE 10
int buffer[BUF_SIZE]; // 缓冲区
int in = 0; // 生产者放置产品的位置
int out = 0; // 消费者取产品的位置
sem_t empty; // 信号量,表示缓冲区中空余的数量
sem_t full; // 信号量,表示缓冲区中已有的数量
pthread_mutex_t mutex; // 互斥锁,保证同一时刻只有一个线程访问缓冲区
// 生产者线程函数
void *producer(void *arg) {
int i, item;
for (i = 0; i < 20; i++) {
item = rand(); // 随机生成一个产品
sem_wait(&empty); // 等待缓冲区空余
pthread_mutex_lock(&mutex); // 加锁
buffer[in] = item; // 放置产品
printf("Producer produces: %d\n", item);
in = (in + 1) % BUF_SIZE; // 指向下一个位置
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&full); // 增加已有的数量
sleep(1); // 休眠一秒
}
pthread_exit(NULL);
}
// 消费者线程函数
void *consumer(void *arg) {
int i, item;
for (i = 0; i < 20; i++) {
sem_wait(&full); // 等待缓冲区有产品
pthread_mutex_lock(&mutex); // 加锁
item = buffer[out]; // 取出产品
printf("Consumer consumes: %d\n", item);
out = (out + 1) % BUF_SIZE; // 指向下一个位置
pthread_mutex_unlock(&mutex); // 解锁
sem_post(&empty); // 增加空余的数量
sleep(2); // 休眠两秒
}
pthread_exit(NULL);
}
int main(int argc, char *argv[]) {
pthread_t tid1, tid2;
// 初始化信号量和互斥锁
sem_init(&empty, 0, BUF_SIZE);
sem_init(&full, 0, 0);
pthread_mutex_init(&mutex, NULL);
// 创建生产者和消费者线程
pthread_create(&tid1, NULL, producer, NULL);
pthread_create(&tid2, NULL, consumer, NULL);
// 等待线程结束
pthread_join(tid1, NULL);
pthread_join(tid2, NULL);
// 销毁信号量和互斥锁
sem_destroy(&empty);
sem_destroy(&full);
pthread_mutex_destroy(&mutex);
return 0;
}
```
在该代码中,使用了pthread库中的线程相关函数和semaphore.h头文件中的信号量相关函数,还使用了互斥锁来保证线程同步。生产者线程每隔1秒生产一个随机数放入缓冲区中,消费者线程每隔2秒从缓冲区中取出一个产品进行消费。运行该代码可以看到生产者和消费者线程交替执行,符合生产者消费者问题的解决方案。
阅读全文