我使用 C 和 POSIX 线程创建了一个多线程应用程序。我现在应该阻塞一个线程(主线程),直到设置了布尔标志(变为真)。
我找到了两种方法来完成这件事。
>
在没有睡眠的情况下旋转。
while(!flag);
在睡眠中旋转循环。
while(!flag){
sleep(some_int);
}
如果我应该遵循第一种方式,为什么有些人编写代码遵循第二种方式?如果应该使用第二种方法,为什么要让当前线程Hibernate呢?这种方式的缺点是什么?
第一种方法(只是简单的时间
)是浪费资源,特别是进程的处理器时间。
当线程进入睡眠状态
时,操作系统可能会决定在讨论具有抢占式多任务的系统时,处理器将用于不同的任务。从理论上讲,如果您拥有与线程一样多的处理器/内核,则不必有任何区别。
解决方案的好坏取决于所使用的操作系统,有时还取决于运行程序的体系结构。您应该查阅syscall参考资料,了解更多有关这方面的信息。
而(标志);
将导致线程使用其分配的所有时间来检查条件。这浪费了大量的CPU周期来检查可能没有改变的东西。
Hibernate一段时间会导致线程暂停,并将CPU交给实际需要它的程序。
但你也不应该这样做;您应该使用线程库创建一个标志对象,并调用其wait
函数,这样内核就会暂停线程,直到设置了标志。
第一个选项(“繁忙等待”)在等待期间浪费整个内核,阻止其他有用的工作完成和/或浪费能量。
第二个选项的浪费更少 - 您的等待线程使用很少的CPU并允许其他线程运行。但是,继续切换回线程以检查标志仍然是浪费的。
使用条件变量比使用条件变量要好得多,它允许等待线程阻塞而不消耗任何资源,直到它能够继续。
我正在调用while循环内的线程Hibernate1秒。当标志为true时,循环将运行(标志为true无限时间)。在循环内,线程应Hibernate1秒,唤醒并增加计数器,检查IF条件,如果为FALSE,则应再次Hibernate1秒并继续29次。在第30次迭代中,IF条件为true,IF语句中调用的方法将收集并存储数据。最后,在第32次迭代中,第二个IF语句将把存储的数据发送到服务器,并将计数设
问题内容: 首先,我想说的是,我知道这个方法是错误的,因此,我出于好奇而问这个问题。可以说我有一个这样的秋千应用程序: 基本上,当我单击按钮时,我期望图像显示,然后GUI冻结2秒钟,然后我期望图像显示。但是发生的是:我单击按钮,GUI冻结2秒钟并显示。没有之前。但是让我感到困惑的是当我把它们和。因此,当我单击按钮时,它会打印“郁金香画”,并在2秒钟后打印“考拉画”。有人可以告诉我这是怎么回事吗?问
我正在研究计算机硬件,在那里我们了解到使用硬件计时器比软件延迟获得更准确的结果。我已经在汇编中编写了1毫秒的软件延迟,我可以启动一个进程,使用这个延迟每毫秒重复一次,并使用计数器每100毫秒做一些其他事情,这种技术不如使用我现在要使用的硬件内置的硬件计时器准确。 所以我想知道Java内置的计时有多精确?我们有< code > system . current time millis 和< code
这里的要点是了解实现等待循环的更有效的解决方案,该循环在每次迭代时轮询条件。通过高效,我的意思是“有效的CPU调度”。 我知道代码中使用的等待条件不是“wakeOne”/“wakeAll”指令中使用的“真正的等待条件”,但我想知道对CPU来说,使用假等待条件是否比睡眠更有效。 这里有2个代码片段,它们做同样的事情:等待某些事情发生。这段代码用于工作线程池。因此,当一个线程等待时,其他线程(或其他一
问题内容: 我习惯从X开始评估我的。在我中,我使用启动我的窗口管理器。现在,如果我杀死了我的WM(为了测试其他WM),X也将终止,因为脚本到达了EOF。所以我在我的末尾添加了这个: 这样,如果我杀死WM,X不会终止。现在我的问题是:我该如何 无限睡眠 而不是循环睡眠?是否有一个类似于冻结脚本的命令? 最好的祝福 问题答案: 完全按照建议进行操作,并且不会虐待猫。
我正在编写一个基于await/sleep范式的网络绑定应用程序。 我更喜欢这样一个答案,不创建任何额外的线程