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来完成互斥。