在执行过程中休眠一个线程

Posted

技术标签:

【中文标题】在执行过程中休眠一个线程【英文标题】:sleeping a thread in the middle of execution 【发布时间】:2012-06-15 16:20:58 【问题描述】:

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

假设我有一个函数Producer。如果Consumersleep()s Producer 正在生产一个单元怎么办?

假设该单位生产了一半。然后它放在 sleep() 上。系统完整性可能存在问题

【问题讨论】:

我不知道一个线程可以命令另一个线程休眠... 可能有一些系统可以让你强制另一个线程休眠,但是在Boost.thread中,你不能指定一个线程作为sleep的目标——它:"Suspends the current thread ..." [强调添加]。 好吧对不起,我不知道一个线程不能命令另一个线程进入睡眠状态。但是它可能会通过轮询来排队线程可能执行的顺序 @DiproSen:是的,您可以通过多种方式要求线程休眠。如果你这样做,它可以(例如)调用sleep。如果/当它发生时,托尼的回答很好地涵盖了这种情况。 【参考方案1】:

调用sleep 的线程被线程调度程序放入空闲队列,并从运行它的CPU 中切换到上下文,因此其他线程可以代替它。

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

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

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

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

【讨论】:

但假设单位是half produced。然后穿上sleep()。系统的完整性可能存在问题,【参考方案2】:

这没有任何问题,除非在线程休眠时某些状态发生了变化,因此它会以不同于进入休眠前的一组值唤醒。

线程始终由 CPU 切换进出执行,但这不会影响其执行的总体结果,假设不存在数据争用或其他错误。

【讨论】:

假设生产需要创建一个项目并将其放入存储中。如果在中途,例如创建后sleep() 被调用。那么不会有什么问题的情况吗? 如果您的线程处于休眠状态时没有其他线程干扰该项目,则应该没有任何问题。【参考方案3】:

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

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

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

【讨论】:

【参考方案4】:

我不知道一个线程强制使另一个线程休眠的方法。如果两个线程正在访问共享资源(例如输入/输出队列,这对您来说很可能是生产/消费者示例),那么两个线程可能会争夺同一个锁。如果争用不是“trylock”种类,失败的线程必须等待其他线程释放锁。等待的线程被放入与锁关联的等待队列中,并从调度程序运行队列中删除。当获胜线程释放锁时,代码会检查队列以查看是否还有线程等待获取它。如果有,则选择一个作为获胜者并获得锁,并将其放入调度程序运行队列中。

【讨论】:

以上是关于在执行过程中休眠一个线程的主要内容,如果未能解决你的问题,请参考以下文章

在线程池中休眠的线程

32 位可执行文件不在 Docker 容器中休眠

在批处理文件中休眠

在 Swift 中休眠或延迟 Timer 线程

在 JavaScript 中休眠 - 动作之间的延迟

在 16 位裸机 nasm 组件中休眠 x 毫秒