Windows核心編程:第7章 線程調度、優先級和關聯性

Github

https://github.com/gongluck/Windows-Core-Program.gitc++

//第7章 線程調度、優先級和關聯性.cpp: 定義應用程序的入口點。
//

#include "stdafx.h"
#include "第7章 線程調度、優先級和關聯性.h"

//線程函數
DWORD WINAPI ThreadProc(PVOID param)
{
    return 0;
}

int APIENTRY wWinMain(_In_ HINSTANCE hInstance,
                     _In_opt_ HINSTANCE hPrevInstance,
                     _In_ LPWSTR    lpCmdLine,
                     _In_ int       nCmdShow)
{
    //線程的掛起和恢復
    HANDLE hthread = CreateThread(nullptr, 0, ThreadProc, nullptr, CREATE_SUSPENDED, nullptr);
    DWORD suspendcount = SuspendThread(hthread);//返回線程的前一個掛起計數
    suspendcount = ResumeThread(hthread);//返回線程的前一個掛起計數

    BOOL bret = SwitchToThread();//當前線程放棄調度,返回是否有其餘可調度線程(低優先級的飢餓線程也會調度)
    Sleep(0);//當前線程放棄調度,可是低優先級的飢餓線程不會調度

    FILETIME c, e, k, u;
    bret = GetThreadTimes(hthread, &c, &e, &k, &u);//獲取線程時間

    //(更)精確的時間計算
    LARGE_INTEGER start, end;
    bret = QueryPerformanceCounter(&start);//時鐘次數
    LARGE_INTEGER frequency;
    bret = QueryPerformanceFrequency(&frequency);//時鐘頻率
    bret = QueryPerformanceCounter(&end);
    double time = (double)(end.QuadPart - start.QuadPart) / (double)frequency.QuadPart;

    //黑科技GetThreadContext、SetThreadContext

    //進程優先級
    STARTUPINFO si = { 0 };
    si.cb = sizeof(si);
    PROCESS_INFORMATION pi = { 0 };
    bret = CreateProcess(TEXT("C:\\WINDOWS\\SYSTEM32\\NOTEPAD.EXE"), nullptr, nullptr, nullptr, FALSE, CREATE_SUSPENDED|NORMAL_PRIORITY_CLASS, nullptr, nullptr, &si, &pi);
    bret = SetPriorityClass(pi.hProcess, BELOW_NORMAL_PRIORITY_CLASS);//修改進程優先級
    DWORD priority = GetPriorityClass(pi.hProcess);

    //線程優先級
    bret = SetThreadPriority(pi.hThread, THREAD_PRIORITY_BELOW_NORMAL);
    priority = GetThreadPriority(pi.hThread);

    //禁止系統自動的優先級提高
    BOOL bPriority;
    bret = SetProcessPriorityBoost(pi.hProcess, FALSE);
    bret = GetProcessPriorityBoost(pi.hProcess, &bPriority);
    bret = SetThreadPriorityBoost(pi.hThread, FALSE);
    bret = GetThreadPriorityBoost(pi.hThread, &bPriority);

    CloseHandle(pi.hProcess);
    pi.hProcess = nullptr;
    CloseHandle(pi.hThread);
    pi.hThread = nullptr;

    //調度IO請求優先級
    bret = SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_BEGIN);//下降線程調度優先級,不容許改變另外一個線程的IO優先級
    /*IO操做*/
    bret = SetThreadPriority(GetCurrentThread(), THREAD_MODE_BACKGROUND_END);//讓線程進程normal級別的調度級別,不容許改變另外一個線程的IO優先級
    //設置進程下全部進程的IO請求優先級
    bret = SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_BEGIN);
    bret = SetPriorityClass(GetCurrentProcess(), PROCESS_MODE_BACKGROUND_END);

    //單獨設置文件IO優先級
    HANDLE hFile = CreateFile(TEXT("C:\\gongluck"), 0, 0, NULL, CREATE_NEW, 0, NULL);
    DWORD err = GetLastError();
    FILE_IO_PRIORITY_HINT_INFO phi;
    phi.PriorityHint = IoPriorityHintLow;
    bret = SetFileInformationByHandle(hFile, FileIoPriorityHintInfo, &phi, sizeof(phi));
    err = GetLastError();
    CloseHandle(hFile);
    hFile = nullptr;

    //進程和CPU關聯性
    DWORD processmask = 0;
    DWORD systemmask = 0;
    bret = GetProcessAffinityMask(GetCurrentProcess(), &processmask, &systemmask);
    bret = SetProcessAffinityMask(GetCurrentProcess(), processmask);
    bret = GetProcessAffinityMask(GetCurrentProcess(), &processmask, &systemmask);

    //線程和CPU關聯性
    DWORD oldmask = SetThreadAffinityMask(hthread, 0x00000001);//限制只能在CPU0上運行
    DWORD oldidea = SetThreadIdealProcessor(hthread, MAXIMUM_PROCESSORS);//設置理想CPU

    CloseHandle(hthread);
    hthread = nullptr;

    system("pause");
    return 0;
}
相關文章
相關標籤/搜索