频道栏目
首页 > 资讯 > 其他 > 正文

生产与消费者三种模型

17-06-20        来源:[db:作者]  
收藏   我要投稿

1.生产者—消费者模型的321原则
生产者-生产者 互斥
消费者-消费者 互斥
生产者-消费者 互斥,同步

typedef struct _head //结构体声明
{
    int data;
    struct _head *next;
}Node,*Node_p,**Node_pp;

Node_p head; //头指针声明

void InitList(Node_pp _h) //初始化带头节点链表
{
    *_h =(Node_p)malloc(sizeof(Node));
    (*_h)->next = NULL;
}
void PushFrond(Node_p _h,int K)//
{
    Node_p tmp = _h->next;
    _h->next =(Node_p)malloc(sizeof(Node));
    _h = _h->next;
    _h->data = K;
    _h->next = tmp;
}

Node_p PopFrond(Node_p _h)
{
    if(_h->next == NULL)
        return NULL;
    Node_p tail = _h->next;
    _h->next = tail->next;
    return tail;
}

void *consume(void *arg) // 用于消费,即调用PopFrond
void &product(void *arg) //用于生产,即调用PushFrond


pthread_mutex_t mutex_lock = PTHREAD_MUTEX_INITIALIZER;
pthread_mutex_lock(&mutex_lock);//加锁
pthread_mutex_unlock(&mutex_lock);//解锁


pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_cond_wait(&cond,&mutex_lock);//等待
pthread_cond_signal(&cond);//发信号


void* product(void *arg)
{
    while(1){
        int n = rand()/12123;
        pthread_mutex_lock(&mutex_lock);    //解锁访问
        PushFrond(head,n);
        printf("product done! %d\n",n);
        pthread_mutex_unlock(&mutex_lock);//解锁
        pthread_cond_signal(&cond);//生产完成,发送信号,消费者消费
        sleep(2);
    }
    return NULL;
}

void *consum(void *arg)
{
    while(1){
        pthread_mutex_lock(&mutex_lock);//加锁访问
        Node_p tmp = PopFrond(head);
        while(tmp == NULL)//当没有资源时,则阻塞等待
        {
            pthread_cond_wait(&cond, &mutex_lock);
            tmp = PopFrond(head);
        }
        printf("consum done! %d\n",tmp->data);
        pthread_mutex_unlock(&mutex_lock);//解锁
    }
    return NULL;
}

相关TAG标签
上一篇:计算给定数组arr中所有元素的总和
下一篇:谈一谈Java8的函数式编程(二) –Java8中的流
相关文章
图文推荐

关于我们 | 联系我们 | 广告服务 | 投资合作 | 版权申明 | 在线帮助 | 网站地图 | 作品发布 | Vip技术培训 | 举报中心

版权所有: 红黑联盟--致力于做实用的IT技术学习网站