1.posix有名信号量&无名信号量(基于内存的信号量)
2.有名信号量
2.1创建&删除
一个进程终止时,内核会自动关闭该进程打开着的信号量,但关闭信号量并没有将信号量从系统删除,该信号量依然存在,只有调用sem_unlink才能从系统中删除。
2.2 等待&挂出
每次只能加1或减1,与system V信号量不同(可加减任意整数)
3.基于内存的信号量
3.1创建&删除
需要注意对于一个内存信号量只能调用一次sem_init,sem_init失败时返回-1,但成功时并不返回0.
3.2 进程间共享信号量(有名信号量与基于内存的信号量区别)
基于内存的信号量要实现进程间共享,需要将该信号量放在共享内存区中,只要该共享内存区存在,该信号量就存在。**注意使用sem_init创建信号量后调用fork,子进程并不能直接使用该信号量,因为子进程不共享父进程的内存空间,这一点与有名信号量不同,调用sem_open创建的有名信号量由于是sem_open在内部动态申请的信号量(malloc申请在了堆上?),所以子进程可以直接使用父进程创建的有名信号量**,要理解基于内存的信号量创建是我们定义一个sem_t变量后,由sem_init函数对这个变量进行赋值,而有名信号量创建是调用sem_open后返回了一个sem_t指针,这意味着是sem_open内部malloc了一个sem_t变量,相当于基于内存的信号量是申请在了该进程的栈上,而有名信号量是申请在了堆上,这就是内存信号量不能在fork后直接使用,而有名信号量可以使用的原因(个人理解)
4.互斥锁&信号量差别
注意当没有线程在等待条件变量时,若产生了条件变量信号,那么此信号将会丢失,而信号量则不会,若没有线程等待信号量,有线程挂出信号量以后,信号量值会增长