使用sleep()的缺点

时间:2012-02-06 02:08:37

标签: c operating-system

对于c编程,如果我想协调两个并发执行的进程,我可以使用sleep()。但是,我听说sleep()不是一个好主意来实现进程之间的事件顺序?有什么理由吗?

4 个答案:

答案 0 :(得分:5)

sleep()不是协调功能。从来没有。 sleep()让你的过程做到这一点 - 进入睡眠状态,在一段时间内根本不运行。

你被误导了。在获取锁失败后,您的来源可能指的是所谓的退避,在这种情况下,随机sleep可能是合适的。

通常在进程之间建立相对事件排序的方式(即,创建一个先发生的边缘)是使用并发控制结构,例如条件变量,它仅在某一点,或者一个更加钝的障碍,它会导致每个线程一直等到所有其他线程都到达程序中的那一点。

答案 1 :(得分:4)

使用sleep()会影响延迟和CPU负载。假设您睡眠1ms并检查一些原子共享变量。平均延迟时间(至少)为0.5ms。您将在此非活动线程中消耗CPU周期来轮询共享原子变量。通常也不保证睡眠时间。

操作系统提供在线程/进程之间进行通信/同步的服务。那些具有低延迟,消耗较少的CPU周期,并且经常有其他保证 - 那些是您应该使用的 ...(例如condition variablesevents,{{3等等)。当你使用那些线程/进程不需要“轮询”。内核在需要时唤醒等待的线程/进程(线程/进程“阻塞”)。

在某些罕见的情况下,轮询是线程/进程同步的最佳解决方案,例如一个semaphores,通常在通过内核的开销大于轮询所花费的时间时。

答案 2 :(得分:0)

睡眠不是一种非常强大的方法来处理进程之间的事件排序,因为有很多东西可能会出错。 如果你的sleep()被打断怎么办? 您需要通过“实现进程之间的事件顺序”来更具体地了解您的意思。

答案 3 :(得分:0)

就我而言,我在芹菜中使用了此功能。我正在做time.sleep(10)。如果celery_task每分钟被调用一次或两次,则工作正常。但它在一种情况下造成了混乱。

  • 如果celery_task被调用了1000次
  • 我有4个芹菜工人,所以上面的1000个芹菜电话排队等待执行。
  • 前4个呼叫是由4个工作人员执行的,其余996个仍在队列中。
  • 工人们在这4个任务中忙了10秒钟,而在10秒钟之后又执行了接下来的4个任务。按照这种方式,大约需要1000 \ 4 * 10 = 2500秒。

最终,我们不得不删除time.sleep,因为它阻塞了我10秒钟。