通过微软官方文档查询到Windows提供了两个Win32函数:SetThreadAffinityMask和SetProcessAffinityMask 为指定线程和进程设置处理器关联掩码。 SetThreadAffinityMask SetThreadAffinityMask用于设置指定线程的处理器关联掩码,从而实现线程对处理器的绑定。 SetThreadAffinityMask函数定义 SetThreadAffinityMask的定义如下: DWORD_PTR SetThreadAffinityMask( [in] HANDLE 调用示例 首先引入Win32API [DllImport("kernel32.dll")] static extern UIntPtr SetThreadAffinityMask(IntPtr hThread 需要注意的是,SetThreadAffinityMask和SetProcessAffinityMask并不是独占CPU核心,如果关联的CPU核心本身负载就很高,这个时候程序执行效率反而会降低。
SetPriorityClass(OSCtxSwW32Handle,THREAD_PRIORITY_HIGHEST); #ifdef SET_AFFINITY_MASK if( SetThreadAffinityMask ( OSCtxSwW32Handle, 1 ) == 0 ) { #ifdef OS_CPU_TRACE OS_Printf("Error: SetThreadAffinityMask ); SetPriorityClass(OSTick32Handle,THREAD_PRIORITY_HIGHEST); #ifdef SET_AFFINITY_MASK if( SetThreadAffinityMask ( OSTick32Handle, 1 ) == 0 ) { #ifdef OS_CPU_TRACE OS_Printf("Error: SetThreadAffinityMask
SetPriorityClass(OSCtxSwW32Handle,THREAD_PRIORITY_HIGHEST); #ifdef SET_AFFINITY_MASK if( SetThreadAffinityMask ( OSCtxSwW32Handle, 1 ) == 0 ) { #ifdef OS_CPU_TRACE OS_Printf("Error: SetThreadAffinityMask\ ); SetPriorityClass(OSTick32Handle,THREAD_PRIORITY_HIGHEST); #ifdef SET_AFFINITY_MASK if( SetThreadAffinityMask ( OSTick32Handle, 1 ) == 0 ) { #ifdef OS_CPU_TRACE OS_Printf("Error: SetThreadAffinityMask
SetPriorityClass(OSCtxSwW32Handle,THREAD_PRIORITY_HIGHEST); #ifdef SET_AFFINITY_MASK if( SetThreadAffinityMask ( OSCtxSwW32Handle, 1 ) == 0 ) { #ifdef OS_CPU_TRACE OS_Printf("Error: SetThreadAffinityMask\ ); SetPriorityClass(OSTick32Handle,THREAD_PRIORITY_HIGHEST); #ifdef SET_AFFINITY_MASK if( SetThreadAffinityMask ( OSTick32Handle, 1 ) == 0 ) { #ifdef OS_CPU_TRACE OS_Printf("Error: SetThreadAffinityMask
}, {"InitializeConditionVariable", "InitializeCriticalSection"}, {"SetThreadGroupAffinity", "SetThreadAffinityMask
使用 SetThreadAffinityMask 函数为多个组中的各个线程设置相关性掩码。 这实际上改变了进程的组分配。 线程分配 CPU 资源 核心函数为 setThreadAffinityMask , 设置指定线程的处理器相关性掩码,官方文档。 语法 C++复制 DWORD_PTR SetThreadAffinityMask( [in] HANDLE hThread, [in] DWORD_PTR dwThreadAffinityMask
GetProcessAffinityMask(GetCurrentProcess(), &processmask, &systemmask); //线程和CPU关联性 DWORD oldmask = SetThreadAffinityMask
单核的还容易办到,但是现在的机器一般都是多核的,这样就需要调用Win32 API SetThreadAffinityMask 来给线程制定CPU去执行。
在 win 平台上会调用这个方法: net.openhft.affinity.impl.WindowsJNAAffinity.CLibrary#SetThreadAffinityMask 这个方法,就是限制线程在哪个 https://docs.microsoft.com/zh-cn/windows/win32/api/winbase/nf-winbase-setthreadaffinitymask?
调用函数SetThreadAffinityMask可以设置亲缘性,使所有线程都在不同的CPU上运行,已达到真正的并发执行。 { HANDLE hThread = CreateThread(NULL, 0, ThreadProc, NULL, CREATE_SUSPENDED, NULL); SetThreadAffinityMask { phThread[i] = CreateThread(NULL, 0, ThreadProc, hWait, CREATE_SUSPENDED, NULL); SetThreadAffinityMask
Windows: 可以使用 SetThreadAffinityMask() 函数来设置线程的亲和度。 Java: 可以使用 Thread.setAffinity() 方法来设置线程的亲和度。
Windows 下绑定线程到指定的 CPU 核心 https://www.cnblogs.com/czwy/p/18166365 Windows 操作系统提供了 SetThreadAffinityMask
Computing组织成员提出了两种应对方法,其中一种方法就是利用Red Pill反复地在系统上循环执行任务,以此构造出一张当前系统的IDT值变化统计图,但这会增加CPU负担;另一种方法就是windows API函数SetThreadAffinityMask
组织成员提出了两种应对方法: 其中一种方法就是利用Red Pill反复地在系统上循环执行任务,以此构造出一张当前系统的IDT值变化统计图,但这会增加CPU负担; 另一种方法就是windows API函数SetThreadAffinityMask