sleep() 系统调用有什么缺点吗?
Does sleep() system call have any drawbacks?
所以我的目标是执行一段由线程处理的代码(假设线程 1 使用 POSIX 线程),同时取消另一个线程(线程 2)执行它各自的任务。线程 1 在特定事件发生时启动(基于时间的事件 - 在我的例子中为 60 秒)。
为此,我使用了 sleep()
函数。但是我的导师告诉我,在多线程程序中使用睡眠是一种不好的做法。我无法理解他的推理。所以我决定逃离这里。
如果我的问题看起来太模糊,请提及 sleep()
的任何缺点,我们将不胜感激。
存在允许线程等待另一个线程的同步原语(例如互斥锁、信号量、条件变量)。
sleep()
也会让你的线程等待,但你要么睡了不必要的长时间(这可能不够,以防另一个线程需要更长的时间),要么你必须检查另一个线程是否已经完成(无论如何你都需要用原子变量或互斥锁来保护它。
因此对于线程同步,sleep
是不够的并且会使一切变得复杂(+减慢)。
I am told by my mentor that it's a bad practice to use sleep in a multithreaded program.
我会反驳那个笼统的声明。
使用 sleep()
作为在特定时间发生某事的方法的替代方法是
向计时器提交任务。如果你有一个线程在特定时间之前除了 sleep()
什么都不做,然后
让事情发生,那么你可以改用计时器。而且,如果线程
有一个循环使事情定期发生,那么你可以使用 recurring
计时器事件,或者 re-submits 本身的计时器事件。
如果你有多个线程,每个线程的存在只使某件事发生在
某个时间,然后你可以通过使用
计时器对象代替。如果你的程序有一个 GUI,那么你就是
可能使用已经有计时器的 GUI 框架,你可以使用,
所以即使只有一个 "timing" 线程也可能会浪费资源。
但是,当您谈论线程时,您是在谈论您的 架构
程序,当您谈论 sleep()
时,您谈论的是 low-level
实施细节。我不由自主地怀疑任何硬性的编程规则
结合了来自如此广泛不同的设计层次的想法。
如果我有很好的理由让线程存在于我的程序中*,那么我会毫不犹豫地
编写创建它的代码,如果我有一个 好的理由 我的线程之一到 sleep()
,**
那么我会毫不犹豫地写那个电话。
* 线程存在的一个很好的理由是管理一些有状态的 "process"
独立于程序内部发生的其他 "processes" 进行。
** 线程休眠的一个很好的理由是,如果有某种原因导致
线程管理的复杂 "process" 的两个步骤 之间需要暂停 。
所以我的目标是执行一段由线程处理的代码(假设线程 1 使用 POSIX 线程),同时取消另一个线程(线程 2)执行它各自的任务。线程 1 在特定事件发生时启动(基于时间的事件 - 在我的例子中为 60 秒)。
为此,我使用了 sleep()
函数。但是我的导师告诉我,在多线程程序中使用睡眠是一种不好的做法。我无法理解他的推理。所以我决定逃离这里。
如果我的问题看起来太模糊,请提及 sleep()
的任何缺点,我们将不胜感激。
存在允许线程等待另一个线程的同步原语(例如互斥锁、信号量、条件变量)。
sleep()
也会让你的线程等待,但你要么睡了不必要的长时间(这可能不够,以防另一个线程需要更长的时间),要么你必须检查另一个线程是否已经完成(无论如何你都需要用原子变量或互斥锁来保护它。
因此对于线程同步,sleep
是不够的并且会使一切变得复杂(+减慢)。
I am told by my mentor that it's a bad practice to use sleep in a multithreaded program.
我会反驳那个笼统的声明。
使用 sleep()
作为在特定时间发生某事的方法的替代方法是
向计时器提交任务。如果你有一个线程在特定时间之前除了 sleep()
什么都不做,然后
让事情发生,那么你可以改用计时器。而且,如果线程
有一个循环使事情定期发生,那么你可以使用 recurring
计时器事件,或者 re-submits 本身的计时器事件。
如果你有多个线程,每个线程的存在只使某件事发生在 某个时间,然后你可以通过使用 计时器对象代替。如果你的程序有一个 GUI,那么你就是 可能使用已经有计时器的 GUI 框架,你可以使用, 所以即使只有一个 "timing" 线程也可能会浪费资源。
但是,当您谈论线程时,您是在谈论您的 架构
程序,当您谈论 sleep()
时,您谈论的是 low-level
实施细节。我不由自主地怀疑任何硬性的编程规则
结合了来自如此广泛不同的设计层次的想法。
如果我有很好的理由让线程存在于我的程序中*,那么我会毫不犹豫地
编写创建它的代码,如果我有一个 好的理由 我的线程之一到 sleep()
,**
那么我会毫不犹豫地写那个电话。
* 线程存在的一个很好的理由是管理一些有状态的 "process" 独立于程序内部发生的其他 "processes" 进行。
** 线程休眠的一个很好的理由是,如果有某种原因导致 线程管理的复杂 "process" 的两个步骤 之间需要暂停 。