#include <windows.h>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

HANDLE ThreadHandles[32];

DWORD
WorkerThread(
    PVOID ThreadIndex
    )
{

    DWORD Processor;
    BOOL DoSleep;

    Processor = (DWORD)ThreadIndex;
    if ( Processor > 100 ) {
        DoSleep = TRUE;
        Processor -= 100;
        }
    else {
        DoSleep = FALSE;
        }
    SetThreadAffinityMask(GetCurrentThread(),1 << Processor);
    for(;;){
        if ( Processor & 1 ) {
            SetThreadPriority(ThreadHandles[Processor-1],THREAD_PRIORITY_ABOVE_NORMAL);
            SetThreadPriority(ThreadHandles[Processor-1],THREAD_PRIORITY_NORMAL);
            }
        else {
            if ( DoSleep ) {
                Sleep(0);
                }
            }
        }
    return 0;
}

int __cdecl
main(
    int argc,
    char *argv[],
    char *envp[]
    )
{
    DWORD i;
    SYSTEM_INFO SystemInfo;
    DWORD ThreadId;
    HANDLE hThread;

    GetSystemInfo(&SystemInfo);
    if ( SystemInfo.dwNumberOfProcessors >= 3 ) {

        for ( i=0;i<SystemInfo.dwNumberOfProcessors;i++) {

            ThreadHandles[i] = CreateThread(
                                NULL,
                                0,
                                WorkerThread,
                                (PVOID)(i),
                                0,
                                &ThreadId
                                );

            if ( !ThreadHandles[i] ) {
                fprintf(stdout,"CreateThread failed %d\n",GetLastError());
                ExitProcess(1);
                }
            }

        for ( i=0;i<SystemInfo.dwNumberOfProcessors;i++) {
            if ( (i & 1) == 0 ) {

                hThread = CreateThread(
                            NULL,
                            0,
                            WorkerThread,
                            (PVOID)(100+i),
                            0,
                            &ThreadId
                            );

                if ( !ThreadHandles[i] ) {
                    fprintf(stdout,"CreateThread failed %d\n",GetLastError());
                    ExitProcess(1);
                    }
                CloseHandle(hThread);
                }
            }
        Sleep(60000);
        }
    ExitProcess(1);
}