C++ 睡眠线程或进程的指令是否在线程/进程处于睡眠状态时继续执行?
当我在两个进程之间使用共享内存的聊天应用程序IPC(进程间通信)上执行任务时,睡眠线程如何检查while循环中的条件(如果*shm!=1,线程打印字符串wakeup),这怎么可能C++ 睡眠线程或进程的指令是否在线程/进程处于睡眠状态时继续执行?,c++,c,C++,C,当我在两个进程之间使用共享内存的聊天应用程序IPC(进程间通信)上执行任务时,睡眠线程如何检查while循环中的条件(如果*shm!=1,线程打印字符串wakeup),这怎么可能 #define TRUE 1 while(*shm == 1) sleep(1) printf("wakeup"); sleep不检查shm值 现在,线程调用sleep,它将暂停线程几毫秒,然后它将被操作系统计时器/调度程序发出的信号唤醒。这就是睡眠所做的一切。然后线程唤醒并恢复代码:sleep()返回,循
#define TRUE 1
while(*shm == 1)
sleep(1)
printf("wakeup");
sleep
不检查shm
值
现在,线程调用sleep
,它将暂停线程几毫秒,然后它将被操作系统计时器/调度程序发出的信号唤醒。这就是睡眠所做的一切。然后线程唤醒并恢复代码:sleep()返回,循环开始下一次迭代,检查shm
,并决定是再次睡眠还是继续
它可以工作,但是如果您在c++11/posix中使用了专门的同步原语(如条件变量),那么它会消耗更多的资源。等待条件变量信号时休眠将真正休眠,直到接收到信号为止,而不会浪费cpu周期进行此类定期唤醒。睡眠
不会检查shm
值
unsigned int sleep(unsigned int seconds);
现在,线程调用sleep
,它将暂停线程几毫秒,然后它将被操作系统计时器/调度程序发出的信号唤醒。这就是睡眠所做的一切。然后线程唤醒并恢复代码:sleep()返回,循环开始下一次迭代,检查shm
,并决定是再次睡眠还是继续
它可以工作,但是如果您在c++11/posix中使用了专门的同步原语(如条件变量),那么它会消耗更多的资源。在等待条件变量信号时休眠将真正休眠,直到接收到信号为止,而不会为此类周期性唤醒浪费cpu周期
unsigned int sleep(unsigned int seconds);
暂停线程执行指定的秒数。因为
对于处理器延迟,线程的睡眠时间可能比这个稍长
指定时间。在此期间接收到的未阻塞信号(用于
调用信号处理函数或结束
线程“过早唤醒”线程。当该函数返回时,
即使还有睡眠时间,sleep()也会立即返回
因此,线程睡眠时,while(*shm==1)
不会计算
暂停线程执行指定的秒数。因为
对于处理器延迟,线程的睡眠时间可能比这个稍长
指定时间。在此期间接收到的未阻塞信号(用于
调用信号处理函数或结束
线程“过早唤醒”线程。当该函数返回时,
即使还有睡眠时间,sleep()也会立即返回
所以你的while(*shm==1)
在线程睡眠时不会计算。不清楚你在问什么。你的睡眠时间很短。实际上,只需将处理器优先级分配给其他线程即可。在非常短的睡眠时间后,它会醒来,检查while条件并相应地继续。如果您正在执行IPC,您肯定会希望在这个过程中的测试周围有一个进程间互斥,而在另一个过程中写入互斥。不清楚您在问什么。你的睡眠时间很短。实际上,只需将处理器优先级分配给其他线程即可。在非常短的睡眠时间后,它会醒来,检查while条件并相应地继续。如果您正在执行IPC,您肯定会希望在该进程中的测试和其他进程中的写入周围有一个进程间互斥。谢谢@Vlad。因此,当调度程序为休眠进程分配CPU时,它将恢复执行,并在此时检查while循环中的条件。如果您认为我更改太多,请随时回滚。我想扩展“ms”缩写,但忘了这不是我的答案,对此表示抱歉:)@quetzalcatl,thx,我对一切能让stackoverflow变得更好的事情都很满意:)谢谢@Vlad。因此,当调度程序为休眠进程分配CPU时,它将恢复执行,并在此时检查while循环中的条件。如果您认为我更改太多,请随时回滚。我想扩展“ms”缩写,但忘了这不是我的答案,对此表示抱歉:)@quetzalcatl,thx,我对一切能让stackoverflow更好的东西都没意见:)