Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么系统时间大于实时时间?_C_Multithreading_Time_Real Time_Systemtime - Fatal编程技术网

C 为什么系统时间大于实时时间?

C 为什么系统时间大于实时时间?,c,multithreading,time,real-time,systemtime,C,Multithreading,Time,Real Time,Systemtime,这是一个程序,它计算10000的除数作为1000创建的最大线程数 我觉得realtime更大了,而且变了 n_线程数为1000 螺纹c struct tms mytms; clock_t t1, t2; if( (t1 = times( &mytms )) == -1 ) { perror( "times 1" ); exit( 1 ); } for( int i = 0; i < n_Threads; i+

这是一个程序,它计算10000的除数作为1000创建的最大线程数

我觉得realtime更大了,而且变了

n_线程数为1000

螺纹c

struct tms mytms;
    clock_t t1, t2;

    if( (t1 = times( &mytms )) == -1 )
    {
        perror( "times 1" );
        exit( 1 );
    }
    for( int i = 0; i < n_Threads; i++ )
    {
        if( pthread_create( &tid[i], NULL, &thread_func, NULL ) != 0 ){
            fprintf( stderr, "pthread_create error!\n" );
            fprintf( stderr, "%s\n", strerror( errno ) );
            exit( 1 );
        }
    }
    for( int i = 0; i < n_Threads; i++ )
    {
        pthread_join( tid[i], NULL );
    }

    if( (t2 = times( &mytms )) == -1 )
    {
        perror( "times 2" );
        exit( 1 );
    }

    fprintf( stdout, "%d 의  약 수 의  개 수 : %d \n", MAX_NUMBER, shared_Value );

    printf( "Real time : %.5f sec\n", (double)(t2 - t1) / CLK_TCK );
    printf( "User time : %.5f sec\n", (double)mytms.tms_utime / CLK_TCK );
    printf( "System time : %.5f sec\n", (double)mytms.tms_stime / CLK_TCK );

为什么系统时间大于实时时间?

系统时间是程序在操作系统中花费的时间量;与用户时间相反,用户时间是程序运行直接代码(+库)所花费的时间

您似乎已经发现创建和删除线程需要大量的系统时间。您可能还发现,将数字增加10000倍比创建和删除线程所需的时间要少得多。这些都是很好的教训

另外,取决于互斥锁是否正确初始化;在无效互斥体上执行互斥体操作所需的时间很少;或者你花了很多时间让1000个线程在一个互斥锁上运行。要想知道是哪个,可以检查这些函数的返回值;通常很有启发性


可能从少量线程开始。对于像您这样的程序,拥有比CPU更多的线程没有什么好处。并非所有的节目都是如此;一些线程周期性地等待I/O操作等;但是对于1000个线程很少有充分的理由。

请编辑您的问题,以显示您用于测量时间的确切命令,并发布
uname-a
的输出。在转换为
double
时,可能存在舍入问题:如果您测量的是滴答时钟的数量,那么输出是什么
intmax\u t
并使用
sysconf(\u SC\u CLK\u TCK)
转换为秒。系统时间统计内核内花费的CPU总时间。如果您有多个CPU或内核,它可能比实时性更高。您读过和吗?
void* thread_func( void* arg )
{
    while(loopValue<=MAX_NUMBER){

        pthread_mutex_lock( (&mutex) );
        if( MAX_NUMBER % loopValue == 0 ) {
            shared_Value++;
        }
        loopValue++;
        pthread_mutex_unlock( (&mutex) );
    }
    return NULL;
}
10000 number of proper divisor : 25
Real time : 0.40000 sec
User time : 0.09000 sec
System time : 0.59000 sec