百科问答小站 logo
百科问答小站 font logo



在linux下,假如一个线程由于持有暂时无法lock的mutex而休眠,这个线程何时会被重新调度? 第1页

  

user avatar   haozhi-yang-41 网友的相关建议: 
      

mutex并不一定自带唤醒机制。

不过linux内核的mutex在无法得到锁的时候,会把自己加入一个waiter队列后进入等待状态。unlock的时候,解锁后会从这个waiter队列中取一个加入到调度器的就绪队列。但需要注意的是,即使这个任务加入到调度器后被立刻唤醒,也不意味着它就一定能得到这个锁,因为此时已经处于解锁状态,大家公平的抢而已。

所以,本质上mutex并不保证在A线程解锁后,立刻就有正在等待这个锁的线程被唤醒去抢这个锁——这个唤醒过程是任务调度器的问题。

而唤醒了之后能不能真的抢到锁,也是不确定的——哪怕是在单核的系统上也是如此(你不能保证你是第一个被唤醒的)。


最后,正常的生产者消费者模型,要避免无谓的重复竞争,难道不应该用semaphore(信号灯)吗?




  

相关话题

  操作系统多进程多线程的相关问题? 
  C++ 中,std::atomic 是真正的「原子」吗? 
  可不可以近似认为,同步就是单线程,异步就是多线程? 
  go mutex阻塞线程吗,如果不阻塞,为什么呢? 
  多核和分布式的编程环境促使产生了并发编程语言,那么它和传统的编程语言有什么本质的不同? 
  android主线程如何保证获取足够的时间片? 
  多个 CPU 操作多线程对主内存中某一共享变量同时进行写入操作可以做到吗? 
  对同一个套接字,在两个线程中都对其调用recv函数,需要对其互斥保护吗? 
  为什么编译器过度优化导致线程安全问题? 
  阻塞/非阻塞、同步/异步还有并发、并行、分布式这些概念的区别是什么?分别适用于哪些编程场景? 

前一个讨论
除了人类,是否有其它哺乳动物吸毒?
下一个讨论
为啥现在说出真实的亲身经历,社会现实总会被质疑成是虚构故事的键盘侠?





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利