#include"wrapper.h"
#include<stdio.h>
void main() {
struct timeval start, end;
pid_t pid[100];
pthread_t tid[100];
int i;
gettimeofday(&start, NULL);
for (i = 0; i < 100; i++) {
pthread_create(&tid[i], NULL, pthread_exit, NULL);//不能调用exit,否则父进程都会退出
}
gettimeofday(&end, NULL);
printf("100次pthread_create:%ld微秒\n", end.tv_usec - start.tv_usec);
gettimeofday(&start, NULL);
for (i = 0; i < 100; i++) {
if ((pid[i] = fork()) == 0) {
exit(0);
}
}
gettimeofday(&end, NULL);
printf("100次fork:%lld微秒\n", (long long)(end.tv_usec - start.tv_usec));//数值比较大,防止变成负数
for (i = 0; i < 100; i++) {
waitpid(pid[i], NULL, WNOHANG);
pthread_join(tid[i], NULL);
}
exit(0);
}
程序运行过程中,系统可能会去响应时钟中断等情况,由此一定会有相应的误差,建议多次实测取最小值,并把一次创建的线程(进程)的数量尽可能增大,使误差所占的比例缩小。
下面是gettimeofday函数及相关结构体的标注:(可以略过)
#include<sys/time.h>
int gettimeofday(struct timeval* tv, struct timezone* tz)
//timeval定义为:
struct timeval{
long tv_sec;/*秒*/
long tv_usec;/*微妙*/
};
//timezone 结构定义为:
struct timezone{
int tz_minuteswest;/*和greenwich 时间差了多少分钟*/
int tz_dsttime;/*type of DST correction*/
}
说明:在使用gettimeofday()函数时,第二个参数一般都为空,因为我们一般都只是为了获得当前时间,而不用获得timezone的数值,timezone即时区,初级阶段用不上。
waitpid()函数的第三个参数options:允许改变waitpid的行为。最常用的一个选项是WNOHANG, 它的作用是防止waitpid把调用者的执行挂起!