Windows核心编程:第7章 线程调度、优先级和关联性

Github

https://github.com/gongluck/Windows-Core-Program.git

//第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;
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏俗人笔记

PHP中检测IP是否是内网IP的三个方法

2223
来自专栏技术小讲堂

LINQ to SQL(2):生成对象模型

在LINQ to SQL中,可以使用自己的编程语言的对象模型映射到关系数据库,在上一节课,已经有一部分内容,简单的介绍了一下这种对象模型的结构,这一节,我们主要...

2794
来自专栏hbbliyong

解决Electron加载带jquery的项目报错问题

<!-- Insert this line above script imports --> <script>if (typeof module === 'o...

3657
来自专栏程序员的酒和故事

C++工程中常用的宏定义(#define)

尽管说define有很多不足之处,很多时候我们需要使用const来替代define, 也可以使用typedef来替代define。 但是,在一些实际工程中,我们...

6156
来自专栏雨尘分享

TCP 看我就够了

3165
来自专栏数值分析与有限元编程

Intel Parallel Studio XE 2018

英特尔 Parallel Studio XE提供的先进工具可用于开发卓越的共享内存应用。使用这些工具开发的应用通常能够在计算机、服务器和集群上更快速地运行,而且...

2907
来自专栏乐沙弥的世界

ORA-32004 的错误处理

启动数据库时,收到了ORA-32004 的错误,错误多是一些过时且在当前版本中不在使用的参数,如果碰到类似的错误,只需要将其

1112
来自专栏FreeBuf

EE 4GEE Mini本地提权漏洞(CVE-2018-14327)分析

我在前段时间从买了一个4G调制解调器。这是一个便携式4G WiFi移动宽带调制解调器。有一天,我查看了安装在电脑上的用于故障排除的服务,我看到了一个奇怪的服务,...

803
来自专栏linux驱动个人学习

基于input子系统的sensor驱动调试(二)

继上一篇:https://cloud.tencent.com/developer/article/1054078 一、驱动流程解析: 1、模块加载: 1 st...

5527
来自专栏ASP.NET MVC5 后台权限管理系统

ASP.NET MVC5+EF6+EasyUI 后台管理系统(75)-微信公众平台开发-用户管理

前言 本节主要是关注者(即用户)和用户组的管理,微信公众号提供了用户和用户组的管理,我们可以在微信公众号官方里面进行操作,添加备注和标签,以及移动用户组别,同...

4796

扫码关注云+社区