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
maggch97 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
maggch97 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 局部温度过高。
|