生产者--消费者模型之互斥锁和条件变量

生产者-消费者模型
三种关系:
(1)生产者与生产者:互斥关系;
(2)生产者与消费者:互斥与同步的关系;
(3)消费者与消费者:互斥关系;
两种角色:(1)生产者;(2)消费者;
一种交易场所:单链表;
注:交易场所通常指的是生产者生产的数据以及消费者消费的数据所保存的数据结构;
互斥锁:
定义互斥锁:
全局定义以及初始化;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
局部定义以及初始化:
 int pthread_mutex_init(pthread_mutex_t *restrict mutex, const pthread_mutexattr_t *restrict attr);
加锁:
int pthread_mutex_lock(pthread_mutex_t *mutex);
int pthread_mutex_trylock(pthread_mutex_t *mutex);
解锁;
int pthread_mutex_unlock(pthread_mutex_t *mutex);
销毁互斥锁:
int pthread_mutex_destroy(pthread_mutex_t *mutex);
注:为了解决临界资源的互斥访问,所以使用互斥锁进行临界资源的互斥访问;但是,互斥访问会导致某些进程或者线程的饥饿问题,所以要进行线程或者进程间的同步,使用条件变量可以实现线程间的同步。
条件变量
定义:条件变量是来描述某些资源是否到达的状态;
定义条件变量:
全局定义以及初始化:
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
局部定义以及初始化:
int pthread_cond_init(pthread_cond_t *restrict cond,  const pthread_condattr_t *restrict attr);
等待条件变量就绪和互斥锁被解锁;
int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);
唤醒 在等待的线程:
(1)唤醒一个线程;
int pthread_cond_signal(pthread_cond_t *cond);
(2)唤醒多个进程:
int pthread_cond_broadcast(pthread_cond_t *cond);
销毁条件变量:
int pthread_cond_destroy(pthread_cond_t *cond);
注:条件变量通过与互斥锁的结合,解决了线程间的互斥与同步;

生产者---消费者模型
注:交易场所为C++STL的list;
producter_consumer.cpp:
#include<stdlib.h>
#include<list>
#include<pthread.h>
#include<iostream>
using namespace std;

pthread_mutex_t lock = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
list<int> list1;

void* producter_running(void* arg)
{
    while(1)
    {
        pthread_mutex_lock(&lock);
        int data = rand()%1000;
        list1.push_front(data);
        cout<<"the producter is done........"<<data<<endl;
        pthread_mutex_unlock(&lock);
        pthread_cond_signal(&cond);
        sleep(1);
    }
}

void* consumer_running(void* arg)
{
    int data = 0;
    while(1)
    {
        data = -1;
        pthread_mutex_lock(&lock);
        if(list1.empty())
        {
            pthread_cond_wait(&cond,&lock);
        }
        data = list1.front();
        list1.pop_front();
        cout<<"the consumer is done........"<<data<<endl;
        pthread_mutex_unlock(&lock);
    }
}
int main()
{
    pthread_t producter;
    pthread_t consumer;
    pthread_create(&producter,NULL,producter_running,NULL);
    pthread_create(&consumer,NULL,consumer_running,NULL);
    cout<<"the producer id"<<producter<<endl;
    cout<<"the consumer id"<<consumer<<endl;
    pthread_join(producter,NULL);
    pthread_join(consumer,NULL);
    pthread_mutex_destroy(&lock);
    pthread_cond_destroy(&cond);
    return 0;
}
Makefile:
producter_consumer_cpp:producter_consumer.cpp
    g++ -o $@ $^ -lpthread

.PHONY:clean
clean:
    rm -f producter_consumer_cpp
运行结果:


下一篇:生产者-消费者模型用环形队列充当交易场所,使用信号量实现。
作者水平有限,若有问题,请留言,谢谢!!
  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Linux中,可以使用C语言的条件变量和线程来实现消费者-生产者模型。下面是一个简单的示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <pthread.h> #define BUFFER_SIZE 10 int buffer[BUFFER_SIZE]; int count = 0; pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER; pthread_cond_t cond_prod = PTHREAD_COND_INITIALIZER; pthread_cond_t cond_cons = PTHREAD_COND_INITIALIZER; void *producer(void *arg) { int item = 0; while (1) { pthread_mutex_lock(&mutex); // 如果缓冲区已满,则等待消费者消费 while (count == BUFFER_SIZE) { pthread_cond_wait(&cond_prod, &mutex); } buffer[count] = item; count++; printf("Producer produced item %d\n", item); // 唤醒消费者线程 pthread_cond_signal(&cond_cons); pthread_mutex_unlock(&mutex); item++; } pthread_exit(NULL); } void *consumer(void *arg) { while (1) { pthread_mutex_lock(&mutex); // 如果缓冲区为空,则等待生产者生产 while (count == 0) { pthread_cond_wait(&cond_cons, &mutex); } int item = buffer[count - 1]; count--; printf("Consumer consumed item %d\n", item); // 唤醒生产者线程 pthread_cond_signal(&cond_prod); pthread_mutex_unlock(&mutex); } pthread_exit(NULL); } int main() { pthread_t producer_thread, consumer_thread; // 创建生产者消费者线程 pthread_create(&producer_thread, NULL, producer, NULL); pthread_create(&consumer_thread, NULL, consumer, NULL); // 等待线程结束 pthread_join(producer_thread, NULL); pthread_join(consumer_thread, NULL); return 0; } ``` 在上面的代码中,生产者线程不断地向缓冲区中生产数据,而消费者线程不断地从缓冲区中消费数据。当缓冲区满时,生产者线程会等待条件变量`cond_prod`,直到有消费者消费数据才会被唤醒。同样,当缓冲区为空时,消费者线程会等待条件变量`cond_cons`,直到有生产者生产数据才会被唤醒。 需要注意的是,在生产者消费者线程之间共享的变量`count`和`buffer`需要进行互斥访问,因此使用了互斥锁`mutex`来保护共享资源的访问。 希望这个示例能帮助你理解如何在Linux中使用C语言的条件变量和线程实现消费者-生产者模型

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值