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
原创粉丝点击