1

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

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

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

4

4 回答 4

3

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

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

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

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

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

于 2012-06-15T16:24:01.690 回答
0

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

于 2012-06-15T16:31:42.677 回答
0

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

线程一直由 CPU 切换进出执行,但这不会影响它们执行的整体结果,假设不存在数据竞争或其他错误。

于 2012-06-15T16:29:20.470 回答
0

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

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

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

于 2012-06-15T16:26:11.443 回答