在执行过程中睡一根线

sleeping a thread in the middle of execution

本文关键字:一根 执行 过程中      更新时间:2023-10-16

当一个线程在执行过程中被其他线程(可能由主线程)置于sleep时会发生什么?

假设我有一个函数Producer.如果生产者Consumer sleep()在一个单元的生产中间怎么办?

假设该单元生产了一半,然后将其置于睡眠状态()。系统的完整性可能有问题

调用

sleep的线程由线程调度程序放入空闲队列中,并从运行它的 CPU 中切换出上下文,以便其他线程可以取代它的位置。

所有上下文(寄存器、堆栈指针、基指针等)都保存在线程堆栈上,因此下次运行时,它可以从中断的位置继续。

操作系统不断在线程之间进行上下文切换,以使系统看起来像是在做多件事。 操作系统线程调度程序算法会处理这个问题。

线程

调度和线程是一个很大的主题,如果你想真正理解它,我建议你开始阅读它。 :)

编辑:不建议将sleep用于线程同步目的,您应该使用适当的同步机制来告诉线程等待其他线程等。

没有与此相关的问题,除非在线程休眠时某些状态发生突变,因此它唤醒时的值集与进入睡眠状态之前不同。

线程始终由 CPU 切换为执行和退出执行,但这不会影响其执行的整体结果,前提是不存在数据争用或其他错误。

一个线程强制和同步干扰另一个线程的执行是不可取的。一个线程可以向另一个线程发送异步消息,请求它以某种方式重新调度自己,但当另一个线程处于合适的状态时,这将由另一个线程处理。

假设它们使用线程安全的通道进行通信,则不会发生任何坏事,因为休眠线程最终会唤醒并从其任务队列中获取数据,或者看到已设置了一些信号量并读取了生产的数据。

如果线程使用非易失性变量或更改状态的直接函数调用进行通信,那就是坏事发生的时候。

我不知道

一个线程强制导致另一个线程休眠的方法。如果两个线程正在访问共享资源(如输入/输出队列,对于您的 Produce/Consumer 示例来说似乎很可能),则两个线程可能会争用同一个锁。如果争用不是"trylock"品种,则失败的线程必须等待另一个线程释放锁。等待的线程被放入与锁关联的等待队列中,并从调度程序运行队列中删除。当获胜线程释放锁时,代码会检查队列以查看是否有线程仍在等待获取它。如果有,则选择一个作为获胜者并被授予锁,并放置在调度程序运行队列中。