Multithreaded latency too random.

Andrey Smagin samspeed at mail.ru
Sun Apr 19 01:03:58 UTC 2020


I wrote simple multithreaded example :
 
main.cpp:
#include <thread>
#include <unistd.h>
#include <time.h>
int dTimeMax = 0;
int dTimeMin = 0x7FFFFFFF;
int Nanosec;
bool ThreadExit = false;
void Thread()
{
    timespec T1,T2;
    for( ; !ThreadExit ; )
    {
        clock_gettime( CLOCK_REALTIME_PRECISE, &T1 );
        clock_gettime( CLOCK_REALTIME_PRECISE, &T2 );
        Nanosec = ( T2.tv_sec - T1.tv_sec )*1000000000 + T2.tv_nsec - T1.tv_nsec ;
        if ( Nanosec > dTimeMax ) dTimeMax = Nanosec;
        if ( Nanosec < dTimeMin ) dTimeMin = Nanosec;
    }
}
int main( int argc, char *argv[] )
{
    std::thread Thr( Thread );
    for( int N=0; N<100000; ++N )
        printf("%d \t%d \t%d\n", dTimeMax, dTimeMin, Nanosec );
    ThreadExit=true;
    Thr.join();
}
 
On my PC 
  dTimeMax — dTimeMin < 8000 in console over ssh.
  dTimeMax — dTimeMin < 5000 in tmpfs file output.
 
On my Orange-Pi Zero board it produce very random values:
 dTimeMax — dTimeMin > 2 000 000 in console over ssh .
  dTimeMax — dTimeMin > 15 000 in tmpfs file output.
 
What can help disable interrupt of thread ?
 
Set kern.hz=250000 not change result.
 
FreeBSD orangepi-zero 13.0-CURRENT FreeBSD 13.0-CURRENT #0 r359929: Thu Apr 16 06:10:42 MSK 2020  /usr/src/arm.armv7/sys/GENERIC-NODEBUG  arm
 
to compile: c++ main.cpp -lthr
 
 
 
 
--
Andrey Smagin


More information about the freebsd-arm mailing list