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 <semaphore.h>
    void *producter(void *arg);//生产者
    void *consumer(void *arg);//消费者
    sem_t i;//信号量
    int running = 1;//线程运行控制
    /******************************************************
    函数名:main函数
    参数:
    功能:多线程,信号量
    *******************************************************/
    int main(int argc, char const *argv[])
    {
        pthread_t producter_t;//生产者线程控制
        pthread_t consumer_t;//消费者线程控制
         sem_init(&i,0,100);//信号量初始化为100
        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);//等待消费者线程退出
        sem_destroy(&i);//销毁信号量
    
        return 0;
    }
    /******************************************************
    函数名:void *producter(void *arg)
    参数:
    功能:生产者函数,使信号量i增加
    *******************************************************/
    void *producter(void *arg)
    {
        int semval = 0;//获取信号量的值
        while(running)//没有设置退出时
        {
                usleep(1);
                sem_post(&i);//信号量增加
                sem_getvalue(&i,&semval);//得到信号量的值
                printf("生产者:当前总数量:%d
    ",semval);
        }
    }
    /******************************************************
    函数名:void *consumer(void *arg)
    参数:
    功能:消费者函数,使信号量i减少
    *******************************************************/
    void *consumer(void *arg)
    {
        int semval = 0;
        while(running)//没有设置退出时
        {
                usleep(1);
                sem_wait(&i);//使信号量减少
                sem_getvalue(&i,&semval);//得到信号量的值
                printf("消费者:当前总数量:%d
    ",semval);
        }
    }

    usleep和sleep的区别:
    函数名: sleep
    头文件: #include

  • 相关阅读:
    android 使用AlarmManager定时启动service
    mac 删除文件夹里所有的.svn文件
    Eclipse配置SVN
    OSD锁定怎么解锁?
    如何用Mac远程桌面连接windows
    获取设备识别信息
    类库冲突问题
    如何将Eclipse中的项目迁移到Android Studio中
    python 日历(Calendar)模块
    python datetime处理时间(转)
  • 原文地址:https://www.cnblogs.com/sigma0-/p/12630529.html
Copyright © 2011-2022 走看看