关于线程的 yield()和 sleep(0)的一点问题

2017-12-13 13:55:42 +08:00
 lollipogo

执行顺序的疑问,不知道下面的理解是否正确?

如果:线程 A 和当前线程优先级相同 yield()可以保证先执行线程 A 而 sleep(0)无法保证谁先执行

希望知道的同学可以解释一下,谢谢啦

2185 次点击
所在节点    问与答
6 条回复
vegito2002
2017-12-13 14:05:24 +08:00
看你的系统的 yield 和 sleep 是怎么实现的. 一般来说 yield 就是设置成 READY, 然后重新参与 schedule, sleep 一般是改成 BLOCk 状态, 所以无法立即参与 schedule. 但是你给 sleep 参数 0, 这个就很 open-ended 了, 有些系统的 sleep 是自动对 0 进行 no-op 的.
vegito2002
2017-12-13 14:07:11 +08:00
另外任何一个都无法保证谁先执行. 优先级并不是决定 scheduler 决策的唯一标准, 建议搜一下 MLFQS
lollipogo
2017-12-13 14:16:57 +08:00
@vegito2002 嗯...底层知识很少,主要是看 Java 线程相关知识点的时候,想到了这一点,但感觉网上的资料说的都不是很清楚,大神能不能说一下如果是 Java 的话,这两种写法的区别...
vegito2002
2017-12-13 14:20:12 +08:00
@lollipogo 这个就不知道了, 我只知道操作系统的层面的只是, 具体到一个 library 怎么实现的, 等楼下吧
lollipogo
2017-12-13 14:23:00 +08:00
@vegito2002 谢谢啦,就是考虑 sleep(0)可能就是让所有线程的执行顺序重新排一下,在想 yield()会不会有特殊的机制去保证大家都一样的情况下优先执行别的线程
kanshan
2017-12-13 15:44:52 +08:00
从字面理解这两个是不同的功能

yield 是把当前线程的运行机会交给其它线程 ,是一个本地方法
而 sleep 是休眠当前线程 在休眠的这段时间类 cpu 会执行其它的线程 执行线程的优先级越高越容易被执行到


如果你想知道更细的信息 就只有去看看 jni 对应的源码了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/414382

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX