ruby 线程#run和线程#wakeup之间的差异

ztigrdn8  于 2023-03-12  发布在  Ruby
关注(0)|答案(2)|浏览(114)

两个方法Thread#run and Thread#wakeup在某种程度上是不同的,但我不清楚。有人能提供一对差异最小的代码(即,差异只是在一个中使用run,在另一个中使用wakeup),显示不同的结果,并可能对此进行解释吗?

Edit正如卡里所指出的,它确实是this question的复制品,而且那里有一个很好的答案,但是现在我不确定线程被唤醒但不运行意味着什么,这与线程处于睡眠状态有什么不同?

iqxoj9l9

iqxoj9l91#

回答你的第二个问题,你不能调度一个休眠线程,但是当一个线程被唤醒时,你可以调度它运行,即使它当前没有运行。
根据我对wakeup与run的理解,第一部分要补充的是,run在它内部调用wakeup,然后在它上面调用run。
希望能有所帮助。

ohfgkhjo

ohfgkhjo2#

唤醒线程但不运行意味着什么
这意味着线程现在是“可运行的”,这表明线程有工作要做(即它不再等待,也没有终止),因此线程调度器知道下次决定恢复哪个线程时要考虑这个线程。另一方面,Thread#run不会让调度器做出选择,而是让目标线程立即运行。
在MRI/YARV上,由于GVL和线程不被抢占的事实,您不会看到使用Thread#wakeup恢复的线程执行,直到当前运行的线程(调用#wakeup的线程)通过、休眠或运行到I/O等待。

相关问题