信号量主要用于进程或线程之间的通信,是指当前某个资源的数量1)初始化:intsem_init(sem_t*sem,intpshared,unsignedintval);//其中sem是应用的信号量,pshared值(1:进程间;0:线程间),val为信号量初值返回值:0,-12)申请资源(P操作):intsem_wait(sem_t*sem);返回值:0,,13)释放资源(V操作):intsem_post(sem_t*sem);返回值:0,-14)创建线程:intpthread_create((pthread_tthread,pthread_attr_tattr,void(start_routine)(void),voidarg);//wherethread:线程标识符;attr:线程属性设置;start_routine:线程函数的起始地址,即线程创建成功后执行的函数;arg:传递给start_routine的参数;例1:两个线程同步读写buffer(productionIssuer,consumerissue):(同步是指进程按指定顺序运行,互不影响)/*书名:Semaphore-线程间通信(生产者/消费者问题)作者:翟小树时间:2020.6.19写作思路:在主程序中再创建一个线程,main程序占用信号量向缓冲区写入数据并释放信号量,子线程获取信号量进行读操作*/includeincludeincludeincludeinclude//信号量相关的include//线程相关的defineN32charbuf[N];sem_tsem;//子线程读函数声明voidfunc_read(voidarg){while(1){sem_wait(&sem);printf("buf=%s",buf);}}intmain(){//初始化一个信号量,设置为线程间使用,设置初始值为资源个数为0//注意初始化信号量应该放在进程或线程创建之前,主要是因为多个线程不按顺序执行if(sem_init(&sem,0,0)<0){perror("sem_init");//错误返回exit(-1);//异常退出返回-1,(正常退出返回0)}pthread_ta_pthread;//创建线程,创建成功后执行func_read函数if(pthread_create(&a_pthread,NULL,func_read,NULL)<0){perror("创建a_pthread失败!!!");exit(-1);}printf("Enterquittoexit\n");//主进程中的写操作do{fgets(buf,32,stdin);//将标准输入内容写入buf,注意程序运行时,在获取到用户输入之前,线程一直处于阻塞状态。sem_post(&sem);//注意之前信号量是0,post释放信号量会加1,此时sem(资源号)为1,处于等待状态子线程可以获取到信号量,往下执行}while(strncmp(buf,"退出",4)!=0);//如果输入不quitreturn0;}运行结果,线程1输入,线程2打印,输入quit退出