当线程/进程睡眠时,睡眠线程或进程的指令是否继续执行?

问题描述 投票:0回答:2

当我在IPC(进程间通信)上做任务时,一个聊天应用程序在两个进程之间使用共享内存,sleep线程如何检查while循环中的条件(如果* shm!= 1,则线程打印字符串wakeup)如何可以这样吗?

#define TRUE 1

while(*shm == 1)
    sleep(1)
printf("wakeup");
c++ c
2个回答
3
投票

sleep不检查shm值。

现在你的线程调用sleep,它将暂停线程几毫秒,然后它将被来自OS定时器/调度程序的信号唤醒。这就是sleep所做的一切。然后线程唤醒并恢复你的代码:sleep()返回,循环开始下一次迭代,检查shm并决定是再次睡眠还是继续。

它可以工作,但是如果你使用了专门的同步原语 - 比如c ++ 11 / posix中的条件变量,它会消耗得更多。在等待状态变量信号时休眠将真正睡眠直到接收到信号,而不会浪费cpu周期来进行这种周期性唤醒。


1
投票
unsigned int sleep(unsigned int seconds);

暂停线程执行指定的秒数。由于处理器延迟,线程可以比此指定时间稍长一些时间。在此期间接收的未阻塞信号(其动作是调用信号处理函数或结束线程)“过早地”唤醒线程。当该函数返回时,即使剩余睡眠时间,sleep()也会立即返回。

因此,当线程睡眠时,你的while(*shm == 1)不会计算。

© www.soinside.com 2019 - 2024. All rights reserved.