内核同步机制API之up
2018-02-27 09:16
267 查看
void up(struct semaphore *sem)函数用于释放一个信号量,一般和down系列函数搭配使用 其源码分析如下: void up(struct semaphore *sem) { unsigned long flags; #这里可以明显看到semaphore 实现中有调用spinlock来保护 raw_spin_lock_irqsave(&sem->lock, flags); #正常情况下down之后sem->wait_list 肯定不为空 if (likely(list_empty(&sem->wait_list))) sem->count++; else #如果sem->wait_list 为null,则调用__up函数 __up(sem); raw_spin_unlock_irqrestore(&sem->lock, flags); } static noinline void __sched __up(struct semaphore *sem) { struct semaphore_waiter *waiter = list_first_entry(&sem->wait_list, struct semaphore_waiter, list); list_del(&waiter->list); waiter->up = true; wake_up_process(waiter->task); } 可以看到up函数首先删除waiter->list,然后通过wakup_up_process 来欢迎形参的task
相关文章推荐
- 内核同步机制API之down_xx
- 内核同步机制API之write_seqcount_begin
- 内核同步机制API之__down_common
- 内核同步机制API之read_seqbegin
- 内核部件之同步机制之互斥体
- 全面解析Linux内核的同步与互斥机制--同步篇 收藏
- [内核同步]浅析Linux内核同步机制
- Linux 内核的同步机制--semaphore, rw_semaphore
- Linux内核同步机制之信号量与锁
- 多线程之旅之三——Windows内核对象同步机制
- 解析Linux内核的同步与互斥机制(一)
- Linux 内核同步机制
- 内核定时机制API之do_settimeofday64
- 内核中的同步机制(三)
- Linux学习笔记:内核同步和互斥机制的简要总结
- linux同步机制之wait_event和wake_up
- [内核同步]Linux内核同步机制之completion
- 浅析Linux内核同步机制
- 内核部件之同步机制之自旋锁
- [Z] Linux 内核同步机制