在测试问题How can I store per-thread state between calls in Perl?的代码的过程中,我注意到第一次执行脚本时,线程执行相互交错。但是在脚本的所有后续执行中,所有线程几乎完全按照它们创建的顺序运行,并且交错非常少。这是Ubunutu 9.04上的Perl ithreads。
也许有人可以告诉我发生了什么事?
答案 0 :(得分:3)
线程调度是OS的复杂实现细节。试着通过观察如何安排线程来弄清楚它是如何工作的几乎是不可能的。而且你不应该根据这些观察结果做出任何假设。在不同的硬件上,OS可以不同地调度线程。
答案 1 :(得分:3)
您的线程在创建顺序中运行主要是由于Perl和操作系统中的实现细节(主要是因为它们的单独执行时间低于操作系统的最短执行时间片)。要交错线程,您可以使用sleep而不是yield(或让线程做一些真正的工作)。
请记住,Perl线程中的yield
只是一个建议,与yield在其他一些语言中的工作方式不同。由于Perl线程是并发的并且主要由操作系统的调度程序管理,除非您使用某种互斥锁来阻止执行,否则它实际上不可能预测它们的执行顺序。