windows核心编程-线程的亲缘性
来源:互联网 发布:淘宝直通车钱可以退吗 编辑:程序博客网 时间:2024/05/17 04:59
1、类似于进程的亲缘性只在多CPU(多核)系统中哪几/1个CPU上执行的行为
2、相对于进程的亲缘性,不能指定线程执行在超过进程亲缘性范围外的CPU上执行
3、线程只能执行在进程亲缘性CPU集合的子集上
4、通过调用SetThreadAffinityMask方法,可以为线程指定可以运行在其上的CPU的
位掩码(原理同进程亲缘性方法)
5、通常利用这个方法,将线程和CPU一一绑定,放置调度程序在不同CPU间来回调度线程,
从而可以提高一些特别程序的性能
6、利用绑定可以预期一些线程彻底利用多CPU系统化的优势,使得每个线程都在不同的
CPU上真正并发的执行
线程的一些统计信息获取:
1、在一些需要性能方面的分析的应用场合,往往需要得到一个线程运行函数的时间统计值
2、在很多时候开发人员利用的是系统的时间函数来自行计算,例如调用GetTickCount方法计算一个时间差
3、其实这个时间往往是不准确的,因为线程有可能被切换出当前时间片(不执行的状态),而时间却一直在流逝,
所以往往结果是不准确的
4、此时可以调用GetThreadTimes方法,更准确的得到关于线程运行的时间统计值,该函数返回的时间值单位是
100ns,也就是毫秒的万分之一精确度
下面的程序执行,在任务管理其上可以看到一个进程满CPU运行,点击回车,第二个满CPU...
#include<windows.h>#include<tchar.h>#include<strsafe.h>#include<malloc.h>#include<time.h>#define GRS_ALLOC(sz) HeapAlloc(GetProcessHeap(),0,sz)#define GRS_CALLOC(sz) HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sz)#define GRS_SAFEFREE(p) if(NULL!=p){HeapFree(GetProcessHeap(),0,p);p=NULL;}#define GRS_USEPRINTF() TCHAR pBuf[1024]={}#define GRS_PRINTF(...)\StringCchPrintf(pBuf, 1024, __VA_ARGS__); \WriteConsole(GetStdHandle(STD_OUTPUT_HANDLE), pBuf, lstrlen(pBuf), NULL, NULL);#define GRS_CPUINDEXTOMASK(dwCPUIndex) (1<<(dwCPUIndex))DWORD WINAPI ThreadFunction(LPVOID lpParam){//线程函数HANDLE hEvent = (HANDLE)lpParam;srand((unsigned int)time(NULL));float fRandAvg = 0.0f;float fCnt = 0.0f;while (TRUE){fCnt += 1.0f;fRandAvg += (float)rand();fRandAvg /= fCnt;if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 0)){break;}}GRS_USEPRINTF();GRS_PRINTF(_T("Rand Avg is %f\n"),fRandAvg);return (DWORD)fCnt;}int _tmain(){GRS_USEPRINTF();//创建停止事件HANDLE hStopEvent = CreateEvent(NULL,TRUE,FALSE,NULL);//获取CPU数SYSTEM_INFO si = {};GetSystemInfo(&si);const DWORD dwCPUCnt = si.dwNumberOfProcessors;//创建线程句柄数组HANDLE* hThread = (HANDLE*)GRS_CALLOC(dwCPUCnt*sizeof(HANDLE));DWORD dwThreadID = 0;DWORD dwCPUIndex = 0;//循环创建线程for (DWORD i = 0; i < dwCPUCnt; i++){hThread[i] = CreateThread(NULL,0,ThreadFunction,hStopEvent,CREATE_SUSPENDED,&dwThreadID);dwCPUIndex = i;SetThreadAffinityMask(hThread[i],GRS_CPUINDEXTOMASK(dwCPUIndex)); //将线程句柄绑定在指定CPU上,设置亲缘关系GRS_PRINTF(_T("线程[ID:0x%x]运行在CPU(%d)上!\n"),dwThreadID,dwCPUIndex);ResumeThread(hThread[i]);GRS_PRINTF(_T("线程[ID:0x%x]创建完毕,请查看任务管理器对应的CPU索引使用率!\n"),GetWindowThreadProcessId);_tsystem(_T("PAUSE"));}//如果每个CPU都安排了一个线程的话,此时应该看到所有CPU占有率几乎都是100%GRS_PRINTF(_T("线程全部创建完毕,请查看任务管理器中CPU的使用率!\n"));_tsystem(_T("PAUSE"));//通知所有线程停止SetEvent(hStopEvent); //等待所有线程退出WaitForMultipleObjects(dwCPUCnt,hThread,TRUE,INFINITE);DWORD dwExitCode = 0;//取得线程退出码,此例中就是循环次数,并关闭所有线程句柄}
0 0
- windows核心编程-线程的亲缘性
- Windows核心编程<读书笔记七>线程的调度、优先级以及亲缘性 【含有代码】
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(上)
- Windows核心编程 第七章 线程的调度、优先级和亲缘性(下)
- windows核心编程之亲缘性
- Windows核心编程学习笔记 第二部分 完成编程任务 第7章 线程的调度 优先级 亲缘性
- 线程的调度、优先级和亲缘性——Windows核心编程学习手札系列之七
- 设置线程的亲缘性,多线程编程
- Windows高级编程之线程调度、优先级和亲缘性
- Windows Programming系列 线程的调度、优先级和亲缘性
- Windows内核之线程的调度,优先级,亲缘性
- Windows Openmp 设置线程亲缘性
- 线程的调度,优先级和亲缘性
- 线程的调度、优先级和亲缘性
- 进程与线程的亲缘性
- C7、线程的调度、优先级、亲缘性
- windows线程调度、线程优先级和亲缘性
- Linux线程亲缘性
- MacOs + Virtualenv + ipython notebook下使用matplotlib
- Android逆向之旅---SO(ELF)文件格式详解
- javascript总结
- MySQL与MariaDB功能对比 --- NULL在ALL/SOME中的处理的不同
- 【51nod1105】【第K大的数】【二分答案】
- windows核心编程-线程的亲缘性
- VIEW
- Postgresql将查询结果导出到文件中
- Git常用命令
- Android逆向之旅---Android应用的汉化功能(修改SO中的字符串内容)
- Duplicate entry '1106a210d0794c45a005ef034bc1b664' for key 'PRIMARY'
- 深度学习(DL):卷积神经网络(CNN):从原理到实现
- 9.2matlab if-else-end分支结构
- web开发优化总结(java)