C++多线程实现绑定CPU的方法详解

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语言编程技术

相关文章