You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

线程/进程休眠执行状态及IPC共享内存循环检查的技术疑问

问题1:线程或进程执行sleep指令后,休眠期间是否会继续执行原有逻辑?

绝对不会!当线程或者进程调用sleep()之后,操作系统会立刻把它从运行状态移到休眠队列,这段时间里它完全不会占用CPU资源,原本的代码逻辑会彻底暂停。只有等休眠时间到了(或者被外部信号打断唤醒),操作系统才会把它重新放回运行队列,等轮到它的时间片时,才会从sleep()之后的代码继续往下执行。

举个直观的例子:

printf("准备睡5秒...\n");
sleep(5);
printf("终于醒啦!\n");

运行这段代码时,会先打印第一句话,然后程序就“卡”住了——5秒内啥也不干,直到时间到了才会打印第二句。

问题2:休眠状态的线程如何检查while循环条件(当*shm != 1时打印"wakeup")?逻辑是怎样实现的?

先给你拆解这段代码的执行逻辑,核心点是:线程在休眠的时候根本不会检查条件!

咱们一步步看这段代码的执行流程:

#define TRUE 1
while(*shm == 1) sleep(1);
printf("wakeup");
  1. 首先,线程会先执行*shm == 1的条件判断:
    • 如果共享内存的值确实是1,就进入循环体,调用sleep(1)——这时候线程才会进入休眠状态,接下来的1秒里完全暂停工作;
    • 如果共享内存的值不是1,直接跳出循环,执行后面的printf("wakeup")。
  2. 当sleep(1)的1秒休眠时间到了,线程被操作系统唤醒,它会回到循环的开头,重新执行*shm == 1的条件判断:
    • 如果这时候共享内存的值已经被其他进程/线程改成非1了,就跳出循环,打印"wakeup";
    • 如果还是1,就再次调用sleep(1),继续休眠1秒,重复这个循环。

说白了,这就是个「检查条件→满足就睡1秒→醒了再检查」的轮询逻辑,休眠的时候线程是完全“躺平”的,只有每次睡醒后才会去看共享内存的值有没有变化。

另外提个小建议:这种轮询休眠的方式其实效率不算高,因为不管共享内存有没有变化,线程每隔1秒都会被唤醒一次。如果是正经的生产环境代码,更推荐用信号量、条件变量这类IPC同步机制,能让线程在共享内存的值发生变化时被直接唤醒,不用一直傻乎乎地每隔1秒醒一次检查。

内容的提问来源于stack exchange,提问作者Henok Tesfaye

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:24:10