2016-11-15 60 views
0

我有两台物理处理器的服务器。我想将当前进程设置为特定组,就好像我是从任务管理器手动执行的那样。请注意,它不是亲缘关系,而是处理器组(每个组有16个逻辑处理器)。在C#和C++中我都找不到这种方法。或者我尝试创建一个具有预设属性的进程:分配进程到处理器组

LPPROC_THREAD_ATTRIBUTE_LIST pAttribs = NULL; 
WORD iNuma = 0; 
STARTUPINFOEX sInfoEx; 
sInfoEx.StartupInfo.cb = sizeof(sInfoEx); 
DWORD size; 
int success = InitializeProcThreadAttributeList(0, 1, 0, &size); 
pAttribs = reinterpret_cast<LPPROC_THREAD_ATTRIBUTE_LIST>(HeapAlloc(GetProcessHeap(), 0, size)); 
success = InitializeProcThreadAttributeList(pAttribs, 1, 0, &size); 
success = UpdateProcThreadAttribute(pAttribs, 0, PROC_THREAD_ATTRIBUTE_PREFERRED_NODE, &iNuma, sizeof(iNuma), NULL, NULL); 
long err = GetLastError(); 
auto fCreationFlags = EXTENDED_STARTUPINFO_PRESENT; 
PROCESS_INFORMATION pi = { 0 }; 
STARTUPINFOEX si = { 0 }; 
si.StartupInfo.cb = sizeof(si); 
si.lpAttributeList = pAttribs; 
int p = CreateProcess(NULL, L"notepad.exe", NULL, NULL, false, fCreationFlags, NULL, NULL, &si.StartupInfo, &pi); 

对CreateProcess的调用使应用程序崩溃,导致访问冲突。

此代码也不起作用。它只是chagnes一个线程的亲和力,但不看它会影响进程的组: How Can I Set Processor Affinity in .NET?

回答

0

根据the documentationCreateProcess Unicode版本可以修改命令行(第二个)参数。传入一个常量字符串(您正在执行)可能会导致访问冲突。您需要传递一个string或可修改的数组。

+0

太棒了!这解决了流程创建的问题。我希望有解决方案来改变现有流程的流程组。 – sergman