在执行过程中睡一个线程

时间:2012-06-15 16:20:59

标签: c++ multithreading boost boost-thread

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

假设我有一个函数Producer。如果Consumer sleep()生产者在生产一个单位的过程中会怎样?

假设单位是一半生产。然后它就睡觉了()。系统的完整性可能存在问题

4 个答案:

答案 0 :(得分:3)

调用sleep的线程由线程调度程序放入空闲队列,并且是从运行它的CPU中切换出来的,因此其他线程可以取而代之。

所有上下文(寄存器,堆栈指针,基指针等)都保存在线程堆栈中,所以当它下次运行时,它可以从它停止的地方继续。

操作系统不断在线程之间进行上下文切换,以使您的系统看起来像是在做多件事。 OS线程调度程序算法负责处理。

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

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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

没有任何问题与此相关,除非某些状态在线程休眠时发生变异,因此它会使用与进入睡眠之前不同的一组值唤醒。

线程一直由CPU切换进出执行,但这并不影响执行的总体结果,假设没有数据竞争或其他错误。

答案 3 :(得分:0)

我不知道线程强行导致另一个线程休眠的方法。如果两个线程正在访问共享资源(如输入/输出队列,这似乎可能是您的Produce / Consumer示例),则两个线程都可以争用同一个锁。如果争用不是“trylock”变种,则丢失的线程必须等待另一个线程释放锁。等待的线程被放入与锁相关联的等待队列中,并从调度程序运行队列中删除。当获胜线程释放锁时,代码会检查队列以查看是否还有线程仍在等待获取它。如果存在,则选择一个作为获胜者并获得锁定,并将其置于调度程序运行队列中。