Ada*_*icz 12
要解除阻塞的下一个线程sem_wait()将是操作系统决定的下一个上下文切换到的线程.没人保证订购; 这取决于您的操作系统的调度策略.它可能是已经脱离CPU最长的线程,或者已经分配了最高"优先级"的线程,或者历史上具有某些资源使用统计信息的线程,或者其他什么.
最有可能的是,您当前的线程(被调用的线程sem_post())将继续运行一段时间,直到它开始等待用户输入,阻塞另一个信号量,或者耗尽其os分配的时间片.然后,操作系统将切换一些完全不相关的进程运行几分之一秒(可能是Firefox或其他东西),然后关闭并处理一些网络流量,让自己喝杯茶,最后,当它到处走动时对它来说,选择你感觉到的其他线程,基于过去的历史是否感觉特定线程更多CPU或I/O限制.
在许多操作系统中,优先考虑I/O绑定的进程,这些进程已经存在很长时间.理论上说,新的过程可能是短暂的(如果它已经存在了五个小时,很可能在接下来的1ms内不会完成),所以我们不妨将它们结束.I/O绑定进程可能继续受I/O限制,这意味着他们很可能在等待其他资源时很快关闭CPU.基本上,操作系统希望找到能够尽快完成的过程,因此它可以回过头来喝茶并运行恶意软件.