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;
    }
  • 相关阅读:
    Educational Codeforces Round 30 B【前缀和+思维/经典原题】
    Educational Codeforces Round 30 A[水题/数组排序]
    洛谷 P2415 集合求和【数学公式/模拟】
    洛谷 P2689 东南西北【模拟/搜索】
    洛谷 P1012 拼数 [字符串]
    codeforces 869C The Intriguing Obsession【组合数学+dp+第二类斯特林公式】
    洛谷 P3927 SAC E#1
    洛谷P3929 SAC E#1
    洛谷P3926 SAC E#1
    codeforces 868B The Eternal Immortality【暴力+trick】
  • 原文地址:https://www.cnblogs.com/season-peng/p/6759523.html
Copyright © 2011-2022 走看看