linux生产者与消费者
‘壹’ 【Linux】POSIX信号量详解,从原理认识到代码实现线程间通信
POSIX信号量提供两种类型:有名信号量与无名信号量。它们实质上都是计数器加上PCB等待队列,以及一系列接口(等待与唤醒接口)。
有名信号量允许通过名字打开共享同一个信号量的多个独立进程,实现同步操作。这比无名信号量更方便,适用范围更广。有名信号量的创建与关闭机制包括通过sem_open函数创建时可能返回SEM_FAILED并设置errno,以及调用sem_close终止关联关系并减少引用计数。
进程终止时,自动关闭已打开的有名信号量。当进程执行exec系列函数时,同样会自动关闭有名信号量。关闭操作不等同于删除。有名信号量的删除需通过sem_unlink函数,同时需注意系统维护的引用计数,只有所有打开该信号量的进程都关闭后才会真正删除。
无名信号量没有名字,适用范围较窄,主要用于线程间同步,因线程共享地址空间。其生命周期有限,线程组退出后无名信号量消失,对于进程间共享的信号量则取决于共享内存的持久性。
无名信号量初始化后,可像操作有名信号量一样进行操作。无名信号量的销毁需调用sem_destroy,确保所有进程不再等待信号量后方可安全执行销毁操作。
信号量用于资源管理,创建时的value值代表资源初始数量。申请资源时调用sem_wait减计数,使用完毕或发布资源时调用sem_post加计数。sem_wait尝试减计数,若成功立刻返回,否则根据当前值返回失败或超时错误。sem_post加计数,若当前值为0且有等待进程则唤醒一个进程继续减计数操作。
有名与无名信号量均可用于实现互斥与同步。互斥时,计数器值为负表示等待队列中有多少个执行流在等待。无名信号量实现生产者与消费者模型的代码实例展示了如何更改资源数量与线程数量以适应不同场景。