linux下使用信号量替换全局变量完成线程阻塞

简单描述下使用的场景 ,打算建立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来完成互斥。

sitemap