c - Tråd prioritet i Windows, har ingen spørgsmål?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg blev sjov med tråde prioritet og affinitet. Hvad jeg gjorde det, så jeg mindst et problem - når jeg kun bruger en CPU, får tråder ikke nok processor tid. For eksempel har jeg her et resultat af min observation.


https://pastebin.com/2fgPwMbw[2]


Første kolonne er tid i ms, anden er en tæller, når tråd har prioritet lig med 0, tredje og fjerde er tæller når prioritet er -1, og femte og sjette er tæller når prioritet er -2.
Og det er min kode:


DWORD WINAPI thread( void* counter )
{
DWORD* local = ( DWORD* )counter;

    while (1)
    {
        for (int i = 0; i < 5000; i++)
        {
            suma += sin( i );
        }
        ++(*local);
        suma = 0;
    }
}


int main( )
{
    DWORD\_PTR affinity = 1;

    SetProcessAffinityMask( GetCurrentProcess( ), affinity );

    LPDWORD counters = ( LPDWORD )calloc( THREADS, sizeof( DWORD ) );

    int normalPriorityIndex = 0;
    int lowPriorityIndex[2] = { 1, 2 };
    int idlePriorityIndex[2] = { 3, 4 };

    HANDLE hw[THREADS] = {
        CreateThread( 0, 0, thread, counters + normalPriorityIndex, 0, 0 ),
        CreateThread( 0, 0, thread, counters + lowPriorityIndex[0], 0, 0 ),
        CreateThread( 0, 0, thread, counters + lowPriorityIndex[1], 0, 0 ),
        CreateThread( 0, 0, thread, counters + idlePriorityIndex[0], 0, 0 ),
        CreateThread( 0, 0, thread, counters + idlePriorityIndex[1], 0, 0 ),
    };

    SetThreadPriority( hw[normalPriorityIndex], 0 );
    SetThreadPriority( hw[lowPriorityIndex[0]], -1 );
    SetThreadPriority( hw[lowPriorityIndex[1]], -1 );
    SetThreadPriority( hw[idlePriorityIndex[0]], -2 );
    SetThreadPriority( hw[idlePriorityIndex[1]], -2 );

    FILE* file;
    char* fileName = ( char* )calloc( 32, sizeof( char ) );
    fileName = "dane.txt";
    fopen\_s( &file, fileName, "w" );

    DWORD startTime = GetTickCount( );
    FILE* stream = stdout;

    while (!\_kbhit( ))
    {
        if (GetTickCount( ) - startTime > 600000)
        {
            break;
        }
        fprintf( file, "\%5.ld  |  ", GetTickCount( ) - startTime );
        fprintf( file, "\%ld  \%ld  \%ld  \%ld  \%ld
",
            counters[normalPriorityIndex], 
            counters[lowPriorityIndex[0]],
            counters[lowPriorityIndex[1]],
            counters[idlePriorityIndex[0]], 
            counters[idlePriorityIndex[1]] );
        Sleep( 750 );
    }

    for (int i = 0; i < THREADS; i++)
        CloseHandle( hw[i] );

    return 0;
}


Hvorfor tråde med prioritet -2 har større tæller, så tråd med prioritet -1 ...?

Bedste reference