相关API:
1、初始化信号量
int sem_init(sem_t* sem,int pshared,unsigned int value);
//pshared为信号量最多由几个进程共享。Linux中只能取o。value一般为1,表示资源可用,为o表示不可用
2、等待信号量,如果信号量为0则等待,如果信号量大于0则返回,同时对值做减1操作
int sem_wait(sem_t* sem);
int sem_trywait(sem_t* sem);
int sem_timedwait(sem_t* sem,const struct timespec* abs_timeout);
3、释放信号量,信号量加1操作
int sem_post(sem_t* sem);
4、获取信号量的值
int sem_getvalue(sem_t* sem,int* sval);
5、销毁信号量
int sem_destroy(sem_t* sem);
信号量在进程是以有名信号量进行通信的,在线程是以无名信号进行通信的。
由于linux还没有实现进程间的通信,只实现了无名信号量,所以在sem_init的第二个参数要为0。
在多线程间的同步是可以通过有名信号量也可通过无名信号,但是一般情况线程的同步是无名信号量,无名信号量使用简单,而且sem_t存储在进程空间中,有名信号量必须LINUX内核管理,由内核结构struct ipc_ids存储,是随内核持续的,系统关闭,信号量则删除,当然也可以显示删除,通过系统调用删除,消息队列,信号量,内存共享,这几个都是一样的原理。
使用信号量解决多线程抢占资源的问题
#include <stdio.h>
#include <stdlib.h>
#include <unisd.h>
#include <pthread.h>
#include <string.h>
#include <semaphore.h>
char buffer[1024];
sem_t sem;//声明信号量
void *pthfun(){
for(int ii=0;ii<3;ii++){
printf("%d:%ld:lock...\n",time(0