sleep()系统调用是否有任何弊端?

时间:2019-06-27 09:02:23

标签: c thread-safety pthreads sleep

所以我的目标是执行一个由线程处理的代码(比如说使用POSIX线程的线程1),同时取消执行其各自任务的另一个线程(线程2)。当发生特定事件(基于时间的事件-在我的情况下为60秒)时,启动线程1。

为此,我使用了sleep()函数。但是我的导师告诉我,在多线程程序中使用睡眠是一种不好的做法。我无法理解他的推理。所以我决定逃到这里。

如果我的问题似乎过于模糊,不妨提及sleep()的任何缺点。

2 个答案:

答案 0 :(得分:2)

  

我的导师告诉我,在多线程程序中使用睡眠是一种不好的做法。

我会反对那个笼统的声明。

使用sleep()作为在特定时间做某事的一种方法是 将任务提交给计时器。如果您有一个线程在某个时间之前除了sleep()之外什么也不做, 使事情发生,那么您可以使用计时器代替。而且,如果线程 有一个循环使事情按周期性发生,那么您可以使用重复发生 计时器事件,或者是重新提交本身的计时器事件。

如果您有多个线程,每个线程仅存在 ,以使某件事发生在 一定的时间,然后您可以使用 计时器对象。如果您的程序具有GUI,那么您就是 可能使用的GUI框架已经可以使用计时器, 因此,即使只有一个“定时”线程也可能浪费资源。

但是,当您谈论线程时,您是在谈论您的体系结构 程序,而当您谈论sleep()时,您所谈论的是低层次的 实施细节。我自动怀疑任何硬性编程规则 结合了来自如此广泛的不同设计层次的想法。

如果我有很好的理由在我的程序中存在一个线程*,那么我会毫不犹豫地 编写创建它的代码,并且如果我有一个正当理由将我的其中一个线程放入sleep(),** 那么我会毫不犹豫地写那个电话。


*线程存在的一个好理由是管理一些有状态的“进程” 进度独立于程序内部发生的其他“过程”。

**线程休眠的一个好理由是,如果有某种原因 在线程管理的复杂“进程”的两个步骤之间需要暂停。

答案 1 :(得分:1)

有些同步原语允许一个线程等待另一个线程(例如互斥体,信号量,条件变量)。 sleep()也将等待您的线程,但是您要么睡了不必要的长时间(如果另一个线程花费更长的时间可能就不够了),或者您必须检查另一个线程是否已完成(无论如何,您都需要使用原子变量或互斥体来保护它。

因此,对于线程同步而言,sleep不足以使一切变得复杂(减慢速度)。