调度关了以后,信号还能等待吗?
最近看了一些OS的PIPE的驱动,都有类似写法:semaphore_wait (pipe->lock);//互斥上锁
/*查看有没有足够数据*/
while ((pipe->total_data - handle->position) < size)
{
task_lock();/*调度关*/
pipe->readers_waiting++;
semaphore_signal (pipe->lock);/*解开互斥锁*/
semaphore_wait (pipe->reader_sem);/*等候WRITER发来的写信号*/
semaphore_wait (pipe->lock););//重新上锁
task_unlock();/*调度开*/
}
//如果数据足够,直接拷贝到BUFFER
copy_data_to_user();
semaphore_signal (pipe->lock);//解开锁
不明白为什么关了调度以后还能等待,即使semaphore_wait (pipe->reader_sem)在关调度期间,并没有真正的切换到其他线程,但是 semaphore_signal (pipe->lock);/*解开互斥锁*/
semaphore_wait (pipe->reader_sem);/*等候WRITER发来的写信号*/
semaphore_wait (pipe->lock););//重新上锁
不明白这一解开和一枷锁有什么意义,而且似乎永远抢占了互斥锁,其他线程能得到锁吗
页:
[1]