机器人车技术开发分享网
linux下使用信号量替换全局变量完成线程阻塞
  • 首页 > Linux
  • 作者:horo2015
  • 2020年8月14日 11:21 星期五
  • 浏览:50
  • 字号:
  • 评论:0
  • 简单描述下使用的场景 ,打算建立2个线程,一个线程接收外部的指令,另一个线程读取外设的信息。

    只有指令到了的时候才能读取外设信息,并且不需要一直占用cpu去读取外设信息。

    简单的可以使用一个全局变量来实现。

    但是为了高内聚,可以使用信号量来实现,当然信号量更多可用于生产者消费者比较多的情况下使用。

    #include <stdlib.h>
    #include <pthread.h>
    #include <stdio.h>
    #include <semaphore.h>
    #include <unistd.h>
     
    #define NUM 5
    int queue[NUM];
     
    sem_t blank_number, product_number;
     
    void *producer(void *arg)// 这里将生产者变为接收socket指令的
    {
        int p = 0;
        while(1){
            sem_wait(&blank_number);// more 3 threads 3个以上线程的时候要加
            recv socket  command
           //do something here 
            sem_post(&product_number);// free a sem  or produce number +1
            sleep(1);
        
        }    
    }
     
    void *consumer(void *arg)
    {
        int c = 0, i;
        while(1) {
            sem_wait(&product_number);
           //do something here  for example 
          // read datas from io ,adc sem_post(&blank_number);//释放blankenumber  +1 sleep(3);
            
        }
    }
     
    int main()
    {
        pthread_t pid, cid;
        
        // 可用资源数为 NUM = 5
        sem_init(&blank_number, 0, NUM);
        sem_init(&product_number, 0, 0);
        pthread_create(&pid, NULL, producer, NULL);
        pthread_create(&cid, NULL, consumer, NULL);
        pthread_join(pid, NULL);
        pthread_join(cid, NULL);
        sem_destroy(&blank_number);
        sem_destroy(&product_number);
        return 0;
    }
    上述讲的只是2个线程互相调用的例子。实际中可能有多个线程,比如多个线程调用外设,读取io adc 等。

    这时需要两个sem来完成互斥。

      您阅读这篇文章共花了:  
     本文无需标签!
    二维码加载中...
    本文作者:horo2015      文章标题: linux下使用信号量替换全局变量完成线程阻塞
    本文地址:http://blog.cvosrobot.com/?post=533
    版权声明:若无注明,本文皆为“机器人车技术开发分享网”原创,转载请保留文章出处。

    返回顶部| 首页| 手气不错| 捐赠支持| 自定义链接| 自定义链接| 自定义链接| 手机版本|后花园

    Copyright © 2014-2017 机器人车技术开发分享网   京ICP备14059411 Copyright 2014-2019 小v工作室 版权所有 All Rights Reserved

    sitemap