如何将线程/进程在一个/多个CPU核上运行

如何将线程/进程在一个/多个CPU核上运行


设置线程/进程与CPU的亲缘性,就是将线程/进程与CPU核进行绑定起来。

实现方法:
设置线程与指定cpu核绑定:SetThreadAffinityMask(GetCurrentThread(),mask);
设置进程与指定cpu核绑定:SetProcessAffinityMask(GetCurrentProcess(),mask);
参数说明:mask是CPU序号的或运算值:1(00000001)表示只运行在CPU第一个核上,2(00000010)表示只运行在CPU第二个核上,3(00000011)表示运行在CPU第一和第二个核上,4(00000100)表示只运行在CPU第三个核上,以此类推设置绑定对应的CPU核。

#include <iostream>
#include <Windows.h>
#include <thread>
 
using namespace std;
void t();
void t1(int cpu)
{
	int a = 0, b = 0;
	SetThreadAffinityMask(GetCurrentThread(), cpu);//绑定线程与cpu核
	int cpu_num = GetCurrentThreadNumber();//获取当前线程在对应的cpu核上运行
	cout << cpu_num;
	while (true)
	{
	//		cout << (a++) + (b++);//注:在这个循环中,使用cout一直打印输出时,因为一直与外设打交道所以会出现还有一个cpu在运行状态
			//int c= (a++) + (b++);
			//int d = c++;
	}
}
int main() {
	SYSTEM_INFO sysInfo;
	GetSystemInfo(&sysInfo);
	printf("cpu num is %d\n", sysInfo.dwNumberOfProcessors);//cpu核个数
	std::thread fun1(t1,0x08);//在cpu3上运行
	std::thread fun2(t1, 0x04);//在cpu2上运行
	std::thread fun3(t1, 0x02);//在cpu1上运行
	system("pause");
	return 0;
}

任务管理器查看运行情况:
cpu使用情况

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
QT中,可以使用QThread类来创建和管理线程。要设置线程指定CPU运行,可以使用QThread的setAffinity方法。 setAffinity方法接受一个QVector<quint64>参数,表示线程可以运行CPU核心的位掩码。每个位对应一个CPU核心,设置为1表示线程可以在该核心上运行,设置为0表示线程不会在该核心上运行。 以下是一个示例代码,演示如何将线程限制在特定的CPU核心上运行: ```cpp #include <QThread> #include <QDebug> class WorkerThread : public QThread { public: void run() { // 在这里执行线程的工作 qDebug() << "Thread started on CPU: " << QThread::currentThread()->idealProcessor(); } }; int main(int argc, char *argv[]) { QCoreApplication a(argc, argv); WorkerThread thread; // 设置只允许线程在第一个和第三个CPU核心上运行 QVector<quint64> affinityMask; affinityMask << 0x01 << 0x04; thread.setAffinity(affinityMask); thread.start(); return a.exec(); } ``` 在上面的示例中,我们创建了一个WorkerThread类,继承自QThread,并重写了run方法来执行线程的工作。在main函数中,我们创建了一个WorkerThread对象,并通过setAffinity方法将线程限制在第一个和第三个CPU核心上运行。 请注意,affinityMask的值是一个位掩码,表示线程可以运行CPU核心。在示例中,0x01对应第一个核心,0x04对应第三个核心。如果要设置更多的核心,可以将相应位置的位设置为1。 希望这可以帮助到你!如果有任何问题,请随时问我。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值