- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有这个代码:
int _break=0;
while(_break==0) {
if(someCondition) {
//...
if(someOtherCondition)_break=1;//exit the loop
//...
}
}
问题是,如果 someCondition
为 false
,则循环会占用 CPU。有没有办法在循环中休眠几毫秒,这样cpu就不会有很大的负载?
更新
我想做的是一个服务器-客户端应用程序,不使用套接字,只使用共享内存、信号量和系统调用。我正在 Linux 上执行此操作。
someOtherCondition
在应用程序接收到“终止”信号时变为真,而如果接收到的消息有效,则 someCondition
变为真。如果它无效,它会一直等待有效消息,而 while 循环会变成一个沉重的无限循环(它可以工作但会使 CPU 负载过多)。我想让它轻量级。
我在 Linux (Debian 7) 上工作。
最佳答案
如果您有一个单线程应用程序,那么是否暂停执行都没有任何区别。
如果您有多个线程在运行,那么您应该使用二进制信号量而不是轮询全局变量。
此线程应在每次迭代开始时获取信号量,而其他线程之一应在您希望此线程运行时释放信号量。
此方法也称为“消费者-生产者”。
当线程尝试获取二进制信号量时:
如果信号量被释放,则调用线程获取它并继续执行。
如果已获取信号量,则调用线程“请求”操作系统阻塞自身,操作系统会在其他线程释放信号量后立即解除阻塞。
整个过程是“原子的”,即在执行信号量代码时不会发生线程之间的上下文切换。这通常通过禁用中断来实现。一切都在信号量代码中实现,因此您无需“担心”。
由于您没有指定您使用的是什么操作系统,我无法提供任何技术细节(即代码)...
如果您试图保护循环内的关键部分(即,如果您正在访问其他一些全局变量,该变量也被其他线程访问,并且至少有一个线程正在更改该全局变量),那么你应该使用 Mutex 而不是二进制信号量。
在这种情况下使用 Mutex 有两个优点:
它只能被获取它的线程释放(从而确保互斥)。
它可以解决在高优先级线程等待低优先级线程完成时发生的特定类型的死锁,而中优先级线程正在阻止低优先级线程完成(也称为优先级反转)。
当然,只有在访问数据时确实需要确保互斥时才需要互斥锁。
现在您已经在您的系统上添加了一些具体细节,下面是一般方案:
第 1 步 - 在开始您的线程之前:
// Declare a global variable 'sem'
// Initialize the global variable 'sem' with 'count = 0' (i.e., as acquired)
第 2 步 - 在此线程中:
// Declare the global variable 'sem' as 'extern'
while(1)
{
semget(&sem);
//...
}
第 3 步 - 在 Rx ISR 中:
// Declare the global variable 'sem' as 'extern'
semset(&sem);
关于c - While 循环占用大量 CPU,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21551217/
我是一名优秀的程序员,十分优秀!