赞
踩
实际上pthread_create 应该是比较快的,但是从线程的创建到线程的调度的时间,取决于操作系统的调度算法以及硬件的性能。
但是我还是想有个大概的概念,到底是us级的还是ms级别的?
#include <stdlib.h>
#include <sys/time.h>
#include <sys/types.h>
#include <unistd.h>
void *test(void* n)
{
//printf("thread%p:pid:%ld\n", pthread_self(), (long int)n);
if(n == 0){
return 0;
}
pthread_t id;
if(pthread_create(&id, NULL, test, --n)) {
fprintf(stderr, "Error creating thread\n");
exit(0);
}
pthread_join(id, 0);
return 0;
}
int main()
{
struct timeval tv0, tv1;
struct timezone tz0, tz1;
gettimeofday(&tv0, &tz0);
test((void*)100);
gettimeofday(&tv1, &tz1);
long int a = (tv1.tv_sec - tv0.tv_sec)*1000000 + tv1.tv_usec - tv0.tv_usec;
printf("time =%lfms\n", (double)a/1000);
}
time =6.976000ms
从这里看,一个线程的生命周期差不多为70us
再看第二个测试代码:
void * kkk(void * n)
{
printf("%ld\n", (long int)n);
return 0;
}
void *test2()
{
struct timeval tv0, tv1;
struct timezone tz0, tz1;
gettimeofday(&tv0, &tz0);
pthread_t id[100];
for(int i = 0; i < 100; i++){
if(pthread_create(&id[i], NULL, kkk, (void*)i)){
fprintf(stderr, "Error creating thread\n");
exit(0);
}
}
gettimeofday(&tv1, &tz1);
long int a = (tv1.tv_sec - tv0.tv_sec)*1000000 + tv1.tv_usec - tv0.tv_usec;
printf("time =%lfms\n", (double)a/1000);
sleep(1);
gettimeofday(&tv0, &tz0);
for(int i = 0; i < 100; i++){
pthread_join(id[i], 0);
}
gettimeofday(&tv1, &tz1);
a = (tv1.tv_sec - tv0.tv_sec)*1000000 + tv1.tv_usec - tv0.tv_usec;
printf("time =%lfms\n", (double)a/1000);
}
int main()
{
test2();
return 0;
}
执行结果:
0
3
2
1
4
7
8
6
9
14
....
.....
time =3.199000ms
99
time =0.533000ms
从上面结果来看,有些线程先创建到时后面才被调度,但从创建到被调度,大约为30us。
因为pthread 创建后立即执行,所以临时无法知道创建的时间,估计应该是10us数量级吧。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。