概念:
信号灯用来实现同步——用于多线程,多进程之间同步共享资源(临界资源)。信号灯分两种,一种是有名信号灯,一种是基于内存的信号灯。
有名信号灯,是根据外部名字标识,通常指代文件系统中的某个文件。
基于内存的信号灯,它主要是把信号灯放入内存的,基于内存的信号灯,同步多线程时,可以放到该多线程所属进程空间里;如果是同步多进程,那就需要把信号灯放入到共享内存中(方便多个进程访问)。
有名信号灯和基于内存的信号灯,具体区别体现在创建和销毁两个函数。有名信号灯使用sem_open和sem_close函数。基于内存的信号灯使用sem_init和sem_destroy函数。sem_init的参数可以控制是同步多线程,还是多进程;且该函数只能调用1次,因为调用后信号灯就存在了( 内存指针存在)。一般,使用基于内存的信号灯同步同进程多线程,使用有名信号灯同步多进程。
有名信号灯同步多线程:
1.sem_open函数。
功能:创建并初始化信号灯,如果存在就返回存在的信号灯。
头文件:#include函数原型:sem_t* sem_open(const char * name,int oflag,mode_t mode,unsigned intvalue);
或者:sem_t* sem_open(const char * name,intoflag);
参数:name是给信号灯指定一个名字。oflag的值为O_CREAT,表示如果信号灯不存在,创建信号灯;为O_CREAT|O_EXCL,如果信号灯不存在报错。后面两个参数,只有新建信号灯时使用。mode为信号灯的权限(0644),value为信号灯的值。
返回值:成功时,返回信号灯的指针,错误返回SEM_FAILED2.sem_close函数。
功能:关闭引用信号灯,信号灯引用计数减1。
头文件:#include函数原型:int sem_close(sem_t *sem)
参数:sem为信号灯的指针
返回值:成功时,返回0,失败,-1注:每个信号灯有一个引用计数器记录当前打开次数.关闭一个信号灯并没有将它从系统中删除,而是信号灯引用计数减13.sem_unlink函数
功能:信号灯引用计数为0时,从系统中删除信号灯。
头文件:#include函数原型:int sem_close(const char *name)
参数:name为信号灯的外部名字
返回值:成功时,返回0,失败,-1
4.sem_wait/sem_trywait函数
功能:等待共享资源,信号灯值为0就睡眠,信号灯值大于0,就使用共享资源,信号灯值减1。sem_trywait当信号灯值为0时,不睡眠,报错。
头文件:#include函数原型:int sem_w