Windows下控制进程和线程的CPU亲和性

1. 控制调用进程的亲和性

void SetSchedAffinity(ULONGLONG cpuMask)
{
    HANDLE handle = GetCurrentProcess();

    // 需要从临时的进程句柄转换成真正的进程句柄,并用完后关闭相应句柄
    HANDLE hCurHandle = nullptr;
    DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), &hCurHandle, 0, FALSE, DUPLICATE_SAME_ACCESS);

    DWORD_PTR eErr = SetProcessAffinityMask(hCurHandle, cpuMask);
    CloseHandle(hCurHandle);
}

2. 控制调用线程的亲和性

void SetThreadAffinity(ULONGLONG cpuMask)
{
    DWORD_PTR dwMask = cpuMask;
    HANDLE handle = GetCurrentThread();
    // 需要从临时的线程句柄转换成真正的线程句柄,并用完后关闭相应句柄
    HANDLE hCurHandle = nullptr;
    DuplicateHandle(GetCurrentProcess(), handle, GetCurrentProcess(), &hCurHandle, 0, FALSE, DUPLICATE_SAME_ACCESS);

    DWORD_PTR eErr = SetThreadAffinityMask(hCurHandle, dwMask);
    CloseHandle(hCurHandle);
}

这两个函数在Windows下是可以的,Linux下也有相应的函数。

现阶段最多只能支持64核的。ULONGLONG 每一个bit代表一个核心。

在Windows11下,有支持超过64核心的函数进行处理。

3. 测试代码:

测试线程

unsigned int ThreadTest(LPVOID pParam)
{
    ULONGLONG cpuMask = (ULONGLONG)pParam;
    IDPSetThreadAffinity(cpuMask);

    while (1)
    {
    }
    return 1;
}

// 设置当前进程在前五个核心上运行

IDPSetSchedAffinity(0, 0, 0x000000000000001f); // 进程在前五个核心上运行

 启动四个线程,分别在不同核上运行,最后设置主线程在第五个核心上运行。

void OnTest()
{
    AfxBeginThread(ThreadTest, (LPVOID)1);        // 第一个核心
    AfxBeginThread(ThreadTest, (LPVOID)2);        // 第二个核心
    AfxBeginThread(ThreadTest, (LPVOID)4);        // 第三个核心
    AfxBeginThread(ThreadTest, (LPVOID)8);        // 第四个核心

    IDPSetThreadAffinity(0x0000000000000010);     // 当前线程在第五个核心
}

4. 注意

进程的亲和性大于线程的亲和性,即如果进程的亲和性控制在前五个,即使线程设置在其他核上,操作系统会将线程控制在进程设置的范围内。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值