zoukankan      html  css  js  c++  java
  • 一个线程和互斥的例子

    主函数建立两个线程,生产者和消费者,生产者使变量递增,消费者使变量递减。建立互斥区

    //start from the very beginning,and to create greatness
    //@author: Chuangwei Lin
    //@E-mail:979951191@qq.com
    //@brief: 一个线程和互斥的例子
    
    #include <stdio.h>
    #include <pthread.h>//线程的头文件
    #include <sched.h>
    void *producter(void *arg);//生产者
    void *consumer(void *arg);//消费者
    int i;//缓冲区的计数值
    pthread_mutex_t mutex;//互斥区变量
    int running = 1;//线程运行控制
    /******************************************************
    函数名:main函数
    参数:
    功能:多线程,互斥
    *******************************************************/
    int main(int argc, char const *argv[])
    {
        pthread_t producter_t;//生产者线程控制
        pthread_t consumer_t;//消费者线程控制
        pthread_mutex_init(&mutex,NULL);//初始化互斥
        pthread_create(&producter_t,NULL,(void*)producter,NULL);//建立生产者线程
        pthread_create(&consumer_t,NULL,(void*)consumer,NULL);//建立消费者线程
        usleep(1);//等待线程创建完毕
    
        running = 0;//设置线程退出值
        pthread_join(producter_t,NULL);//等待生产者线程退出
        pthread_join(consumer_t,NULL);//等待消费者线程退出
        pthread_mutex_destroy(&mutex);//销毁互斥
    
        return 0;
    }
    /******************************************************
    函数名:void *producter(void *arg)
    参数:
    功能:生产者函数,在互斥区里使变量i增加
    *******************************************************/
    void *producter(void *arg)
    {
        while(running)//没有设置退出时
        {
                pthread_mutex_lock(&mutex);//进入互斥区
                i++;//计数值增加
                printf("生产者:当前总数量:%d
    ",i );
                pthread_mutex_unlock(&mutex);//离开互斥区
        }
    }
    /******************************************************
    函数名:void *consumer(void *arg)
    参数:
    功能:消费者函数,在互斥区里使变量i减少
    *******************************************************/
    void *consumer(void *arg)
    {
        while(running)//没有设置退出时
        {
                pthread_mutex_lock(&mutex);//进入互斥区
                i--;//计数值减少
                printf("消费者:当前总数量:%d
    ",i );
                pthread_mutex_unlock(&mutex);//离开互斥区
        }
    }

    用命令gcc -o mutex mutex.c -lpthread进行编译,pthread使线程函数的链接库
    运行结果如下:

    [scut_lcw@localhost lcw20150804]$ ./mutex
    生产者:当前总数量:1
    生产者:当前总数量:2
    生产者:当前总数量:3
    生产者:当前总数量:4
    生产者:当前总数量:5
    生产者:当前总数量:6
    生产者:当前总数量:7
    生产者:当前总数量:8
    生产者:当前总数量:9
    消费者:当前总数量:8

    而且每次运行的结果都不大一样,体现了进程之间的竞争。

  • 相关阅读:
    Objective
    ios 贝塞尔画图
    M端的飞行宝石代码(启发性代码)
    T端单机定时间随机召唤生物的脚本
    T端升级宝石
    Xcode中如何屏蔽某个源文件的编译警告信息
    xcode合并模拟器和真机静态库的编译
    layoutSubviews setNeedsDisplay
    限制只能输入数字字母
    正确使用Block避免Cycle Retain和Crash
  • 原文地址:https://www.cnblogs.com/sigma0-/p/12630530.html
Copyright © 2011-2022 走看看