当我在IPC(进程间通信)上做任务时,一个聊天应用程序在两个进程之间使用共享内存,sleep线程如何检查while循环中的条件(如果* shm!= 1,则线程打印字符串唤醒)这怎么可能?
#define TRUE 1
while(*shm == 1)
sleep(1)
printf("wakeup");
答案 0 :(得分:3)
sleep
未检查shm
值。
现在你的线程调用sleep
,它将暂停线程几毫秒,然后它将被来自OS定时器/调度程序的信号唤醒。这就是sleep
所做的一切。然后线程唤醒并恢复代码:sleep()返回,循环开始下一次迭代,检查shm
并决定是再次睡眠还是继续。
它可以工作,但是如果你使用了专门的同步原语 - 比如c ++ 11 / posix中的条件变量,它会消耗得更多。在等待条件变量信号时休眠将真正睡眠,直到接收到信号,而不会浪费cpu周期来进行这种周期性唤醒。
答案 1 :(得分:1)
unsigned int sleep(unsigned int seconds);
暂停线程执行指定的秒数。因为 处理器延迟,线程可以睡得比这稍长 指定时间。在此期间收到的未阻塞信号(for 其中的动作是调用信号处理函数或结束 线程)过早地“唤醒”线程。当该函数返回时, 即使剩余睡眠时间,sleep()也会立即返回。
所以你的while(*shm == 1)
在线程休眠时不会计算。