C++多线程实现绑定CPU的方法详解
Windows多线程
windows.h中提供了多线程解决方案,创建多线程的函数为
//返回值:一个HANDLE类型的值,表示线程的句柄,可用于等待线程等函数 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // 不用管,一般为NULL SIZE_T dwStackSize, // 堆栈大小,一般为0,表示默认值 LPTHREAD_START_ROUTINE lpStartAddress, // 函数指针 __drv_aliasesMem LPVOID lpParameter, // 参数指针 DWORD dwCreationFlags, // 不用管,一般为0 LPDWORD lpThreadId // 线程id,一般设为NULL );
为了理解这个函数,下面举一个最简单的例子
#include<iostream> #include<windows.h> // 编写了一个我的线程函数 DWORD WINAPI MyThread(LPVOID ps) { int *n = (int *)ps; for (int i = 0; i < 3; ++i) printf("执行线程%d, i=%d\n", n[0], i); return 0L; } int main() { // 创造线程 int id1 = 1, id2=2; CreateThread(NULL, 0, MyThread, &id1, 0, NULL); CreateThread(NULL, 0, MyThread, &id2, 0, NULL); system("PAUSE"); return 0; }
其中,MyThread是一个用于创造新线程的函数,其输入参数ps是一个LPVOID类型的指针,在参数传入后,将这个指针转为整形指针(int *),然后将其赋给另一个整形指针n,然后在for循环中引用这个整形指针。
在main函数中,通过CreateThread函数创建一个线程并执行,其中执行的函数为MyThread,传入的参数为id1, id2的地址。执行后的结果为
执行线程2, i=0执行线程1, i=0执行线程1, i=1执行线程1, i=2执行线程2, i=1执行线程2, i=2请按任意键继续. . .
windows调度与绑定CPU
作为成熟的操作系统,Windows为了更加充分利用CPU,会动态分配线程占用的CPU资源,以确保每个CPU核心不过累;另一方面,Intel作为成熟的CPU,为了充分考虑性能和能耗之间的均衡,当CPU没有满负荷运行的时候会自动降频。
这两个合在一起就是,Windows动态分配CPU核心,让每个CPU都不过载;然后Intel动态规划能耗,让每个核心都降频。于是CPU的频率越降越低,Windows占用的资源越来越少,于是性能越来越差。
上面这个描述当然略显夸张了,但道理是这么个道理,为了验证这一点,可以将上面的MyThread函数稍作改动,
DWORD WINAPI MyThread(LPVOID ps) { int* n = (int*)ps; int cpu = GetCurrentProcessorNumber(); for (int i = 0; i < 5; ++i) { printf("在CPU%d上执行线程%d, i=%d\n", cpu, n[0], i); Sleep(100); } return 0L; }
这样就可以查看每次执行线程时所使用的CPU,发现每次运行时使用的CPU是随机的。
通过windows.h中的SetThreadAffinityMask来手动分配CPU,使用方法非常简单
int main() { // 创造线程 int id1 = 1, id2=2; auto th1 = CreateThread(NULL, 0, MyThread, &id1, 0, NULL); SetThreadAffinityMask(th1, 0x01); auto th2 = CreateThread(NULL, 0, MyThread, &id2, 0, NULL); SetThreadAffinityMask(th2, 0x02); // 记得等待线程结束 system("PAUSE"); return 0; }
效果如下
在CPU0上执行线程1, i=0在CPU1上执行线程2, i=0请按任意键继续. . . 在CPU1上执行线程2, i=1在CPU0上执行线程1, i=1在CPU0上执行线程1, i=2在CPU1上执行线程2, i=2在CPU1上执行线程2, i=3在CPU0上执行线程1, i=3在CPU1上执行线程2, i=4在CPU0上执行线程1, i=4
关于C++多线程实现绑定CPU的方法详解的文章就介绍至此,更多相关C++多线程绑定CPU内容请搜索编程教程以前的文章,希望以后支持编程教程!
下一章:C++ 折叠参数包详解(悄然增强编程效率)
前言本节将为大家带来折叠参数包的详细讲解,折叠参数包为C++模板编程提供了更加灵活和强大的工具,可以提高代码的简洁性和可读性,看完后希望对你有收获 一、介绍折叠参数就是一个参 ...