clock()函数在多线程时的问题

void test()
{

}

int main()
{
    timeval tStart,cTime;
    int i = 0;
    long long tPassed = 0;
    gettimeofday(&tStart, 0);
#pragma omp parallel for
    for(i = 0; i < INT_MAX; ++i)
    {
        test();
    }
    gettimeofday(&cTime, 0);
    cTime.tv_sec -= tStart.tv_sec;
    cTime.tv_usec -= tStart.tv_usec;
    tPassed = 1000000LL * cTime.tv_sec + cTime.tv_usec;
    tPassed /= 1000;
    printf("Time = %lldms\n", tPassed);
    return 0;
}

clock()函数在多线程时的问题_第1张图片

改为clock后

int main()
{
    clock_t start = clock(), end;
    int i = 0;
#pragma omp parallel for
    for(i = 0; i < INT_MAX; ++i)
    {
        test();
    }
    end = clock();
    cout << (end - start) / CLOCKS_PER_SEC * 1000 << "ms" << endl;
    return 0;
}

结果是时间和串行的程序一样,查找资料得知:

clock()函数的功能: 这个函数返回从“开启这个程序进程”到“程序中调用C++ clock()函数”时之间的CPU时钟计时单元(clock tick)数当程序单线程或者单核心机器运行时,这种时间的统计方法是正确的。但是如果要执行的代码多个线程并发执行时就会出问题,因为最终end-begin将会是多个核心 总共执行的时钟嘀嗒数,因此造成时间偏大。


clock有三个问题:
1)如果超过一个小时,将要导致溢出.
2)函数clock没有考虑CPU被子进程使用的情况.
3)也不能区分用户空间和内核空间.

你可能感兴趣的:(操作系统,C语言)