多线程导致CPU使用率更高
对于下面的代码,我的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使用。
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
线程等待子线程来完成。
谢谢你,我希望我的进程能持续运行,在这种情况下我必须使用infinte while循环 – Happy
在linux中有3个线程:
- 1 - 主线程中,你的主()被执行
- 2 - f_thread
- 3 - s_thread
主线程一会儿(1)循环等待,这导致大量资源使用。 你不应该使用while(1),而应该使用pthread_join
(http://www.manpagez.com/man/3/pthread_join/)。
随着pthread_join
,你的主线程将休眠,直到其他两个线程完成。因此不会有不必要的资源使用。
谢谢你,我想要我的过程将持续运行,在这种情况下,我必须使用infinte while循环 – Happy
在调用pthread_join之前,在主线程中执行您的工作。只要工作正在进行中,主线程没有到达pthread_join调用。不知何故,如果你在主线程中的工作已经完成,它应该等待pthread_join(如果两个线程f_thread&s_thread尚未完成)。 –
这也取决于你在做什么工作。如果您正在使用阻止呼叫,则(1)可以。例如while(1){read(....)}。在这里,主线程不会占用资源,因为它会在读取时被阻塞。当有数据要读取时,它会重新计划。很简单,(1)会占用你的CPU。 –
将睡眠命令放入循环中。例如,下面的“休眠”命令睡一秒:
while(1) {
sleep(1);
}
有迹象表明,睡眠时间少的其他命令,例如“usleep”由unistd.h中提供,其休眠微秒的给定数量的:
while(1) {
usleep(1000);
}
你可以请张贴你试过的单线程版本。 – ibid
我很困惑。你编写了一个无限循环'while(1);'然后......想知道为什么只需要97%的CPU?当你到达无限循环时,你的线程已经死了,他们会在哪里帮助?我很困惑你想完成什么。 – sarnold
这是一个简单的例子,我计算出来,但假设我的线程也包含一个无限循环... – Happy