zoukankan      html  css  js  c++  java
  • Linux多线程编程

    用消费者生产者模型说明Linux多线程编程

    //作用:阻塞并等待某处用函数pthread_cond_signal()发送信号
    pthread_cond_wait(&cond, &lock);
    //1.进入函数(这时的互斥量已经被锁住)
    //2.等待条件
    //3.解锁互斥量
    //4.等待条件
    //5.锁住互斥量
    //6.函数返回(这时的互斥量还是被锁住)
    //
    //说明:
    //1.在第2步就开始等待,是为了防止条件改变发生在第3步和第4步之间,防止遗漏任何的条件改变
    //2.在进入函数时就锁住互斥量,保护了条件变量,防止条件变量在调用函数pthread_cond_wait()之前就改变
    //3.函数pthread_cond_wait()放在while()循环中,可防止当该函数返回时,被互斥量保护的普通变量goods仍不满足条件
    #include <stdlib.h>
    #include <stdio.h>
    #include <pthread.h>
    
    #define MAX 20
    
    pthread_mutex_t lock;
    pthread_cond_t cond;
    int goods = 0;
    void *ThrPro(void *ptr)
    {
        sleep(5);//休眠5s
        int i;
        for(i = 0; i < MAX; i++) {
            pthread_mutex_lock(&lock);
            while(goods != 0)
                pthread_cond_wait(&cond, &lock);
            printf("pro add, i:%d, goods:%d
    ", i, goods);
            goods++;
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&lock);
        }
        pthread_exit(0);
    }
    
    void *ThrCon(void *ptr)
    {
        int i;
        for(i = 0; i < MAX; i++) {
            pthread_mutex_lock(&lock);
            while(goods == 0)
                pthread_cond_wait(&cond, &lock);
            printf("con min, i:%d, goods:%d
    ", i, goods);
            goods--;
            pthread_cond_signal(&cond);
            pthread_mutex_unlock(&lock);
        }
        pthread_exit(0);
    }
    
    int main()
    {
        pthread_t pro, con;
    
        pthread_mutex_init(&lock, 0);//初始化互斥量lock
        pthread_cond_init(&cond, 0);//初始化条件变量
        pthread_create(&pro, 0, ThrPro, 0);//创建线程pro,从函数ThrPro处运行
        pthread_create(&con, 0, ThrCon, 0);//创建线程con,从函数ThrCon处运行
        pthread_join(pro, 0);//阻塞,以等待线程pro结束
        pthread_join(con, 0);//阻塞,以等待线程con结束
        pthread_mutex_destroy(&lock);//释放互斥量lock
        pthread_cond_destroy(&cond);//释放条件变量cond
        return 0;
    }
  • 相关阅读:
    event对象之与onmouse相关的事件触发
    对文档树进行导航
    event对象的onkeydown使用
    event的onchange方法
    函数名-函数参数坑-迭代器
    函数进阶-名称空间
    初识函数
    文件管理
    基础数据类型补充-编码进阶
    集合-缓存机制-深浅copy
  • 原文地址:https://www.cnblogs.com/season-peng/p/6759523.html
Copyright © 2011-2022 走看看