2016-11-15 59 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