虽然在CPU上循环很重

时间:2014-02-04 11:29:05

标签: c linux infinite-loop

我有这段代码:

int _break=0;
while(_break==0) {

    if(someCondition) {
        //...
        if(someOtherCondition)_break=1;//exit the loop
        //...
    }

}

问题是,如果someConditionfalse,则循环在CPU上变得很重。有没有办法在循环中休眠几毫秒,这样cpu就不会有巨大的负载?

更新

我正在尝试做的是服务器 - 客户端应用程序,不使用套接字,只使用共享内存,信号量和系统调用。我在linux上做这个。

当应用程序收到“kill”信号时,

someOtherCondition变为true,而如果收到的消息有效,则someCondition为真。如果它无效,它会一直等待有效的消息,而while循环变成一个无限循环(它可以工作,但加载CPU太多)。我想让它变得轻巧。

我正在使用Linux(Debian 7)。

2 个答案:

答案 0 :(得分:3)

如果您有单线程应用程序,那么暂停执行是否会有任何区别。

如果您运行多个线程,则应使用二进制信号量而不是轮询全局变量。

这个线程应该在每次迭代开始时获取信号量,其他一个线程应该在你希望这个线程运行的时候释放信号量。

此方法也称为“消费者 - 生产者”。

当线程尝试获取二进制信号量时

  • 如果释放了信号量,则调用线程获取它并继续执行。

  • 如果已经获取了信号量,则调用线程“请求”操作系统阻塞自身,并且一旦其他线程释放信号量,操作系统将解除阻塞。

整个过程是“原子的”,即在执行信号量代码时不会发生线程之间的上下文切换。这通常通过禁用中断来实现。一切都在信号量代码中实现,所以你不必“担心”它。

由于您没有指定您正在使用的操作系统,因此我无法提供任何技术细节(即代码)......

UPDATE:

如果您正在尝试保护循环内的关键部分(即,如果您正在访问其他全局变量,其他线程也正在访问该变量,并且这些线程中至少有一个正在更改该全局变量),那么你应该使用Mutex而不是二进制信号量。

在这种情况下使用Mutex有两个好处:

  1. 它可以被获取它的线程释放(从而确保相互排斥)。

  2. 它可以解决当高优先级线程等待低优先级线程完成时发生的特定类型的死锁,而中优先级线程阻止低优先级线程完成(又名优先级的反转)。

  3. 当然,如果您确实需要确保互斥以访问数据,则需要使用互联网

    更新#2:

    现在您已经在系统中添加了一些具体细节,以下是一般方案:

    步骤#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);
    

答案 1 :(得分:0)

在没有任何延迟的情况下旋转循环将使用相当数量的CPU,小的时间延迟将减少您的权利。

使用Sleep()是最简单的方法,在Windows中,这是在windows.h标题中。

话虽如此,最优雅的解决方案是对代码进行处理,以便代码只在条件为真时运行,这样它才会真正入睡,直到你将其唤醒为止。

我建议你研究一下pthread和互斥量。这将允许您完全睡眠你的循环,直到条件成立为止。

希望以某种方式有所帮助:)