线程/进程休眠执行状态及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");
- 首先,线程会先执行
*shm == 1的条件判断:- 如果共享内存的值确实是1,就进入循环体,调用
sleep(1)——这时候线程才会进入休眠状态,接下来的1秒里完全暂停工作; - 如果共享内存的值不是1,直接跳出循环,执行后面的
printf("wakeup")。
- 如果共享内存的值确实是1,就进入循环体,调用
- 当
sleep(1)的1秒休眠时间到了,线程被操作系统唤醒,它会回到循环的开头,重新执行*shm == 1的条件判断:- 如果这时候共享内存的值已经被其他进程/线程改成非1了,就跳出循环,打印"wakeup";
- 如果还是1,就再次调用
sleep(1),继续休眠1秒,重复这个循环。
说白了,这就是个「检查条件→满足就睡1秒→醒了再检查」的轮询逻辑,休眠的时候线程是完全“躺平”的,只有每次睡醒后才会去看共享内存的值有没有变化。
另外提个小建议:这种轮询休眠的方式其实效率不算高,因为不管共享内存有没有变化,线程每隔1秒都会被唤醒一次。如果是正经的生产环境代码,更推荐用信号量、条件变量这类IPC同步机制,能让线程在共享内存的值发生变化时被直接唤醒,不用一直傻乎乎地每隔1秒醒一次检查。
内容的提问来源于stack exchange,提问作者Henok Tesfaye
相关产品推荐
相关产品推荐

