2011-11-24 38 views
0

对于下面的代码,我的CPU使用率为97%。我在Ubuntu上运行c代码。多线程导致CPU使用率更高

#include <stdio.h> 
#include<pthread.h> 
void *s_thread(void *x) 
{ 
     printf("I am in first thread\n"); 
} 
void *f_thread(void *x)  
{ 
     printf("I am in second thread\n"); 
} 

int main() 
{ 
     printf("I am in main\n"); 
     pthread_t fth; 
     int ret; 
     ret = pthread_create(&fth,NULL,f_thread,NULL); 
     ret = pthread_create(&sth,NULL,s_thread,NULL); 
     while(1); 
     return 0; 
}   

这个简单的代码比只运行一个线程给了我更多的cpu使用。

+0

你可以请张贴你试过的单线程版本。 – ibid

+7

我很困惑。你编写了一个无限循环'while(1);'然后......想知道为什么只需要97%的CPU?当你到达无​​限循环时,你的线程已经死了,他们会在哪里帮助?我很困惑你想完成什么。 – sarnold

+0

这是一个简单的例子,我计算出来,但假设我的线程也包含一个无限循环... – Happy

回答

6
int main() 
{ 
    printf("I am in main\n"); 

    pthread_t fth,sth; 
    int ret; 

    ret = pthread_create(&fth,NULL,f_thread,NULL); 
    ret = pthread_create(&sth,NULL,s_thread,NULL); 

    pthread_join(&fth,NULL); 
    pthread_join(&sth,NULL); 

    return 0; 
} 

while(1)使用更多的CPU周期,所以使用pthread_join和加入这一进程,使main线程等待子线程来完成。

+0

谢谢你,我希望我的进程能持续运行,在这种情况下我必须使用infinte while循环 – Happy

4

在linux中有3个线程:

  • 1 - 主线程中,你的主()被执行
  • 2 - f_thread
  • 3 - s_thread

主线程一会儿(1)循环等待,这导致大量资源使用。 你不应该使用while(1),而应该使用pthread_join(http://www.manpagez.com/man/3/pthread_join/)。

随着pthread_join,你的主线程将休眠,直到其他两个线程完成。因此不会有不必要的资源使用。

+0

谢谢你,我想要我的过程将持续运行,在这种情况下,我必须使用infinte while循环 – Happy

+0

在调用pthread_join之前,在主线程中执行您的工作。只要工作正在进行中,主线程没有到达pthread_join调用。不知何故,如果你在主线程中的工作已经完成,它应该等待pthread_join(如果两个线程f_thread&s_thread尚未完成)。 –

+0

这也取决于你在做什么工作。如果您正在使用阻止呼叫,则(1)可以。例如while(1){read(....)}。在这里,主线程不会占用资源,因为它会在读取时被阻塞。当有数据要读取时,它会重新计划。很简单,(1)会占用你的CPU。 –

1

将睡眠命令放入循环中。例如,下面的“休眠”命令睡一秒:

while(1) { 
    sleep(1); 
} 

有迹象表明,睡眠时间少的其他命令,例如“usleep”由unistd.h中提供,其休眠微秒的给定数量的:

while(1) { 
    usleep(1000); 
}