有没有人知道如何将Java进程中的各个线程锁定到特定的CPU内核(在Linux上)?我在C中完成了这个,但是在Java中找不到如何做到这一点.我的直觉是这需要一个JNI电话,但我希望这里有人可能有一些见解或者可能以前做过.
谢谢!
因为大多数C程序员都知道libc为线程cpu亲和性调优提供了一个非可移植的函数(pthread_attr_setaffinity_np()).但是,我真正不知道的是在实现内核模块时如何做到这一点.任何提及或重定向到一些真实示例的答案都会非常有用.
我有1500个线程..我希望它们在12个处理器上运行...为此我打电话
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors)); 其中numprocessors = 12.这是正确使用面具吗?它需要是可扩展的,即如果我希望它只在11个处理器上运行,那么
SetThreadAffinityMask(GetCurrentThread(),1<<(threadnum%numprocessors));numprocessors = 11.
下面的代码确实编译并运行,除了输出不是我期望的那样.我希望程序创建n个线程(取决于可用的多核数量)并运行在程序结束时找到的简单例程进行输出
"测试"
接下来是1-10.我得到的是一个输出,它写了一些数字,但它最多不超过两个,并且函数threadmain似乎不完全在一个线程上运行,但它有点输出测试:012在其他线程.我知道多线程会破坏输出,但我应该在屏幕的某处看到数字3,4,5,6,7,8,9,但它没有显示出来.
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <stdio.h>
#include <cmath>
#include <iostream>
HANDLE *m_threads = NULL;
static DWORD_PTR WINAPI threadMain(void* p);
DWORD_PTR GetNumCPUs()
{
SYSTEM_INFO m_si = {0, };
GetSystemInfo(&m_si);
return (DWORD_PTR)m_si.dwNumberOfProcessors;
}
CRITICAL_SECTION g_crit_sec;
static int g_start = 0;
int main(int argc, char **args)
{
DWORD_PTR c = GetNumCPUs();
m_threads = new HANDLE[c];
InitializeCriticalSectionAndSpinCount(&g_crit_sec, 0x80000400);
for(DWORD_PTR i = 0; i < c; i++)
{
DWORD_PTR m_id = 0;
DWORD_PTR m_mask = 1 << i;
m_threads[i] = CreateThread(NULL, 0, …Run Code Online (Sandbox Code Playgroud)