use std::thread; use std::time::Duration; fn main() { // 创建一个线程 A thread::spawn(move || loop {}); // 睡眠一段时间,看子线程运行 thread::sleep(Duration::from_millis(100000)); }
rust 写了一个空循环, 看看是不是能跑满一个核心. 结果从任务管理器里看就是几个核心来回满载, 所以 Windows 的线程居然是在不同核心里来回切换?
![]() | 1 BrettD 2022-11-16 16:10:12 +08:00 via iPhone 你没有自己手动设置 affinity 的话,线程可以自由在任何一个 CPU 线程上运行 |
2 cc666 2022-11-16 16:11:51 +08:00 线程是有自己的时间片的,不是一直跑个不停,再调度的时候不保证在哪个核心。 |
5 penzi 2022-11-16 16:23:00 +08:00 |
6 dqzcwxb 2022-11-16 16:45:22 +08:00 线程是同一时间只有一个核心在执行它,但是不保证始终是同一个核心 |
![]() | 7 ysc3839 2022-11-16 16:49:42 +08:00 @maggch97 Linux 好像是会优先分配给上一次运行的核心跑。 不过 Windows 似乎有隐藏的电源选项可以调调度逻辑,可以用这个软件调 https://coderbag.com/product/quickcpu/features/windows/power-plan-management |
8 Jooooooooo 2022-11-16 16:54:25 +08:00 八股文里似乎很少问 windows 的逻辑 -.- |
9 penzi 2022-11-16 17:16:54 +08:00 |
10 cppc 2022-11-16 17:17:50 +08:00 你在任务管理器里面可以勾选哪些 CPU 核跑你的程序 |
11 MrKrabs 2022-11-16 19:16:36 +08:00 很正常啊 |
![]() | 12 opiviqo 2022-11-17 11:46:32 +08:00 不然呢 一个核心跑到死? 每个时间片哪个 cpu 空就哪个 cpu 运行。 |
13 hez2010 2022-11-17 17:12:44 +08:00 via Android 这种调度机制是用来均摊热量的,防止一个核心持续工作造成 CPU 局部温度过高。 |