所以我的目标是执行一个由线程处理的代码(比如说使用POSIX线程的线程1),同时取消执行其各自任务的另一个线程(线程2)。当发生特定事件(基于时间的事件-在我的情况下为60秒)时,启动线程1。
为此,我使用了sleep()
函数。但是我的导师告诉我,在多线程程序中使用睡眠是一种不好的做法。我无法理解他的推理。所以我决定逃到这里。
如果我的问题似乎过于模糊,不妨提及sleep()
的任何缺点。
答案 0 :(得分:2)
我的导师告诉我,在多线程程序中使用睡眠是一种不好的做法。
我会反对那个笼统的声明。
使用sleep()
作为在特定时间做某事的一种方法是
将任务提交给计时器。如果您有一个线程在某个时间之前除了sleep()
之外什么也不做,
使事情发生,那么您可以使用计时器代替。而且,如果线程
有一个循环使事情按周期性发生,那么您可以使用重复发生
计时器事件,或者是重新提交本身的计时器事件。
如果您有多个线程,每个线程仅存在 ,以使某件事发生在 一定的时间,然后您可以使用 计时器对象。如果您的程序具有GUI,那么您就是 可能使用的GUI框架已经可以使用计时器, 因此,即使只有一个“定时”线程也可能浪费资源。
但是,当您谈论线程时,您是在谈论您的体系结构
程序,而当您谈论sleep()
时,您所谈论的是低层次的
实施细节。我自动怀疑任何硬性编程规则
结合了来自如此广泛的不同设计层次的想法。
如果我有很好的理由在我的程序中存在一个线程*,那么我会毫不犹豫地
编写创建它的代码,并且如果我有一个正当理由将我的其中一个线程放入sleep()
,**
那么我会毫不犹豫地写那个电话。
*线程存在的一个好理由是管理一些有状态的“进程” 进度独立于程序内部发生的其他“过程”。
**线程休眠的一个好理由是,如果有某种原因 在线程管理的复杂“进程”的两个步骤之间需要暂停。
答案 1 :(得分:1)
有些同步原语允许一个线程等待另一个线程(例如互斥体,信号量,条件变量)。
sleep()
也将等待您的线程,但是您要么睡了不必要的长时间(如果另一个线程花费更长的时间可能就不够了),或者您必须检查另一个线程是否已完成(无论如何,您都需要使用原子变量或互斥体来保护它。
因此,对于线程同步而言,sleep
不足以使一切变得复杂(减慢速度)。