linux下信号量semaphore的应用

 

http://www.yuanma.org/data/2006/0721/article_1195.htm



生产者线程用于往链表里添加节点,数个工作线程从链表取出节点并处理。对于一般的mutex_lock,mutex_unlock方式,如果这一段时间没有工作,那么工作线程将会不停的调用lock,unlock操作。而这样的操作毫无疑义。

 

在这里系统给我们提供了另外一种同步机制,信号灯,Semaphore

信号灯其实就是一个计数器,也是一个整数。每一次调用wait操作将会使semaphore值减一,而如果semaphore值已经为0,则wait操作将会阻塞。每一次调用post操作将会使semaphore值加一。将这些操作用到上面的问题中。工作线程每一次调用wait操作,如果此时链表中没有节点,则工作线程将会阻塞,直到链表中有节点。生产者线程在每次往链表中添加节点后调用post操作,信号灯值会加一。这样阻塞的工作线程就会停止阻塞,继续往下执行。

信号灯的类型为sem_t。在声明后必须调用sem_init()。需要传递两个参数,第一个参数就是你之前声明的sem_t变量,第二个必须为0。当你不再需要信号灯时,你必须调用sem_destroy()来释放资源。

等待信号灯的操作为sem_wait()。投递一个信号的操作为sem_wait()。和互斥量一样,等待信号灯也有一个非阻塞的操作,sem_trywait()。该操作在没有信号灯的时候返回EAGAIN

下面是一个结合了互斥量和信号灯的例子:

 

 


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux信号量的实现原理是基于操作系统提供的semaphore.h头文件中的sem_t类型。要使用信号量,首先需要创建一个sem_t类型的变量,并对其进行初始化。 在Linux中,信号量的操作主要包括P操作和V操作。P操作被称为申请操作,它的本质是尝试获取临界资源的使用权限。当执行流申请信号量时,如果信号量的计数器大于0,表示临界资源可用,执行流可以继续执行;如果计数器等于0,表示临界资源已被占用,执行流将被挂起等待。P操作的实质是将计数器减一。 V操作被称为释放操作,它的本质是归还临界资源的使用权限。当执行流释放信号量时,计数器加一。如果有其他执行流在等待信号量,被挂起的执行流将被唤醒并获得资源的使用权限。 为了保证P和V操作的原子性,需要使用互斥锁来对这些操作进行加锁和解锁。这样可以保证在多个执行流同时申请或释放信号量时,操作的正确性和一致性。当信号量的计数器为0时,执行流会被挂起等待,直到有其他执行流释放信号量并唤醒它们。 在实际使用中,需要注意的是,在初始化信号量时,可以设置pshared参数来指定信号量是线程间共享还是进程间共享。如果pshared参数为0,则表示信号量在线程间共享;非零值表示信号量在进程间共享。同时,需要设置value参数来指定信号量的初始值,即计数器的初始值。 综上所述,Linux信号量的实现原理是基于semaphore.h头文件中的sem_t类型。通过对计数器的加减操作和互斥锁的应用,实现了对临界资源的申请和释放控制。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [Linux —— 信号量](https://blog.csdn.net/sjsjnsjnn/article/details/126307485)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值