Below you will find pages that utilize the taxonomy term “Tokio”
August 14, 2025
Rust 里 thread::park() 与 thread::yield_now() 的区别
"\u003cp\u003e在看 tokio 调度源码时,会有一些操作线程park的函数,而在rust标准库里也同样有类似的方法,那就是 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.park.html\"\u003ethread::park()\u003c/a\u003e ,同时还有一个咋一看效果类似的函数 \u003ca href=\"https://doc.rust-lang.org/std/thread/fn.yield_now.html\"\u003ethread::yield_new()\u003c/a\u003e, 两个函数都有实现 **\u003ccode\u003e类似\u003c/code\u003e**暂停执行代码的效果,那它们到底又何区别呢?\u003c/p\u003e\n\u003cp\u003e希望通过这篇文章可以让大家搞明白它们两者的区别和使用场景。\u003c/p\u003e\n\u003cp\u003e我们先看一下 \u003ccode\u003ethread::park() \u003c/code\u003e\u003c/p\u003e\n\u003ch2 id=\"threadpark\"\u003ethread:park()\u003c/h2\u003e\n\u003cp\u003e对于 park 函数的作用主要是实现当前线程的阻塞,并出让CPU,这时OS调度器会将其它线程调度到CPU,继续执行其它任务。但是一旦调用这个函数后,后续线程将一直处于阻塞状态,也就是说此线程将无法获取CPU处理任务,直到调用 unpark() 函数,才恢复正常。\u003c/p\u003e\n\u003cp\u003e从线程状态角度来看,它的转换\u003c/p\u003e\n\u003cdiv class=\"highlight\"\u003e\u003cpre tabindex=\"0\" style=\"color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;\"\u003e\u003ccode class=\"language-text\" data-lang=\"text\"\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003erunning ---\u0026gt; [thread::park()] ---\u0026gt; blocked (等待唤醒)\n\u003c/span\u003e\u003c/span\u003e\u003cspan style=\"display:flex;\"\u003e\u003cspan\u003eblocked ---\u0026gt; [thread::unpark()]---\u0026gt; runnable ---\u0026gt; running (被unpark唤醒后)\n\u003c/span\u003e\u003c/span\u003e\u003c/code\u003e\u003c/pre\u003e\u003c/div\u003e\u003cp\u003e总结\u003c/p\u003e\n\u003cul\u003e\n\u003cli\u003e …\u003c/li\u003e\u003c/ul\u003e"