Linux下使用c语言,用多线程实现生产者-消费者问题
时间: 2024-05-08 22:20:00 浏览: 9
好的,理解了你的问题。生产者-消费者是一个经典的线程同步问题,需要使用线程锁和条件变量来实现。
首先,我们需要定义一个缓冲区,用来存储生产者生产的数据。缓冲区可以是一个队列或数组,缓冲区大小可以预先定义。
我们需要两个线程函数:生产者函数和消费者函数。生产者函数负责将数据写入缓冲区,消费者函数负责从缓冲区中读取数据。
我们还需要定义一些变量来实现线程同步,包括互斥锁和条件变量。
下面是一个简单的代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define BUFFER_SIZE 10
pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER; //定义互斥锁
pthread_cond_t cond_producer = PTHREAD_COND_INITIALIZER; //定义生产者条件变量
pthread_cond_t cond_consumer = PTHREAD_COND_INITIALIZER; //定义消费者条件变量
int buffer[BUFFER_SIZE]; //定义缓冲区
int count = 0; //定义缓冲区计数器
void *producer(void *arg) //生产者函数
{
int i;
for (i = 0; i < 20; i++) //生产20个数据项
{
pthread_mutex_lock(&lock); //加锁
while (count == BUFFER_SIZE) //缓冲区满,等待消费者消费
pthread_cond_wait(&cond_producer, &lock);
buffer[count] = i;
count++;
printf("Producer produced item %d\n", i);
pthread_cond_signal(&cond_consumer); //唤醒等待的消费者
pthread_mutex_unlock(&lock); //解锁
}
pthread_exit(NULL);
}
void *consumer(void *arg) //消费者函数
{
int i, item;
for (i = 0; i < 20; i++) //消费20个数据项
{
pthread_mutex_lock(&lock); //加锁
while (count == 0) //缓冲区空,等待生产者生产
pthread_cond_wait(&cond_consumer, &lock);
item = buffer[count-1];
count--;
printf("Consumer consumed item %d\n", item);
pthread_cond_signal(&cond_producer); //唤醒等待的生产者
pthread_mutex_unlock(&lock); //解锁
}
pthread_exit(NULL);
}
int main(int argc, char **argv)
{
pthread_t tid_producer, tid_consumer;
pthread_create(&tid_producer, NULL, producer, NULL);
pthread_create(&tid_consumer, NULL, consumer, NULL);
pthread_join(tid_producer, NULL);
pthread_join(tid_consumer, NULL);
return 0;
}
```
以上代码使用了互斥锁和条件变量来实现生产者-消费者同步。具体实现可以参考代码注释。
希望对你有帮助!