Linux下多任务间通信和同步-POSIX信号量
嵌入式开发交流群280352802,289195589,欢迎加入!
POSIX信号量是另一种信号量的实现.它的定义和功能有System V信号量基本一样,不同的是这组信号量函数的名字已“sem_”开头.基本的系统该调用有四个:sem_init(),sem_wait(),sem_post()和sem_destory().
#include <semaphore.h> int sem_init(sem_t *sem, int pshared , unsigned value);
#include <semaphore.h> int sem_wati(sem_t *sem);如果对一个值为0的信号量调用sem_wait(),这个函数就会等待直到有其他线程增加了这个值使它不再是0为止.如果有两个线程都在sem_wait()中等待同一个信号量变成非0值,那么当它被第三个线程增加一个“1”时,等待线程中只有一个能够对信号量做减法并继续执行,另外一个还将处于等待状态.若调用成功则返回0,否则返回-1.参数sem指向一个用于同步的信号量结构.
#include <semaphore.h> int sem_post(sem_t *sem);当有线程阻塞在这个信号量上时,调用这个函数会使其中的一个线程不再阻塞.具体说来,sem_post()函数的作用是给信号量的加一个“1”,它是一个原子操作,即同时对同一个信号量做加“1”操作的两个线程是不会冲突的,信号量的值会正确地加上一个“2”.若调用成功则返回0,否则返回-1.参数sem指向一个用于同步的信号量结构.
#include <semaphore.h> int sem_destory(sem_t *sem);若调用成功则返回0,否则返回-1.参数sem指向一个用于同步的信号量结构.
POSIX信号量应用实例
/**************************************************************************************/ /*简介:信号量同步线程演示程序 */ /*************************************************************************************/ #include <stdio.h> #include <pthread.h> #include <semaphore.h> #define MAXSTACK 100 int stack[MAXSTACK][2]; int size=0; sem_t sem; /* 从文件1.dat读取数据,每读一次,信号量加一*/ void ReadData1(void) { FILE *fp=fopen("1.dat","r"); while(!feof(fp)) { fscanf(fp,"%d %d",&stack[size][0],&stack[size][1]); sem_post(&sem); ++size; } fclose(fp); } /*阻塞等待缓冲区有数据,读取数据后,释放空间,继续等待*/ void HandleData1(void) { while(1) { sem_wait(&sem); printf("Plus:%d+%d=%d\n",stack[size][0],stack[size][1], stack[size][0]+stack[size][1]); --size; } } int main(void) { pthread_t t1,t2; sem_init(&sem,0,0); pthread_create(&t1,NULL,(void *)HandleData1,NULL); pthread_create(&t2,NULL,(void *)ReadData1,NULL); /* 防止程序过早退出,让它在此无限期等待*/ pthread_join(t1,NULL); return 0; }事先编辑好数据文件1.dat,假设它们的内容如为:1 2 3 4 5 6 7 8 9 10.程序运行的结果如下: