当我调用ERROR_INVALID_PARAMETERS并使用PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY扩展属性时,我一直得到错误87,即PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY。我使用完全相同的代码调用CreateRemoteThreadEx,这很好。而且,PROC_THREAD_ATTRIBUTE_PREFERRED_NODE似乎没有任何效果。那我做错什么了?
2008 R2企业,6.1.7601 SP1 Build 7601
我甚至安装了这个服务包:Windows 7或Windows 2008 R2中的节点参数
下面是示例代码:
#include <windows.h>
typedef unsigned __int64 QWORD;
class CErr {
public:
CErr(LPCSTR szFunc, DWORD nErr) {
char szBuf[0x10000];
DWORD fFlags = FORMAT_MESSAGE_IGNORE_INSERTS|FORMAT_MESSAGE_FROM_SYSTEM;
DWORD fLang = MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT);
if (!nErr)
nErr = GetLastError();
FormatMessage(fFlags, NULL, nErr, fLang, szBuf, sizeof(szBuf) - 1, NULL);
printf("%s: %s", szFunc, szBuf);
}
};
int main(int argc, char* argv[])
{
DWORD nErr;
size_t cb;
char sAttribsBuf[4096];
auto pAttribs = (PPROC_THREAD_ATTRIBUTE_LIST)sAttribsBuf;
if (!InitializeProcThreadAttributeList(NULL, 1, 0, &cb)
&& ((nErr = GetLastError()) != ERROR_INSUFFICIENT_BUFFER))
throw CErr("InitializeProcThreadAttributeList", nErr);
if (!InitializeProcThreadAttributeList(pAttribs, 1, 0, &cb))
throw CErr("InitializeProcThreadAttributeList", 0);
#if 1 // if enabled, CreateProcess succeeds, but doesn't set affinity
WORD iNuma = 1; // WORD is the only size that does not error here
if (!UpdateProcThreadAttribute(pAttribs, 0, PROC_THREAD_ATTRIBUTE_PREFERRED_NODE,
&iNuma, sizeof(iNuma), NULL, NULL))
throw CErr("UpdateProcThreadAttribute", 0);
#else // if enabled, CreateProcess fails with ERROR_INVALID_PARAMETERS(87)
GROUP_AFFINITY GrpAffinity = { 0 };
GrpAffinity.Mask = 1;
if (!UpdateProcThreadAttribute(pAttribs, 0, PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY,
&GrpAffinity, sizeof(GrpAffinity), NULL, NULL))
throw CErr("UpdateProcThreadAttribute", 0);
#endif
auto fCreationFlags = EXTENDED_STARTUPINFO_PRESENT;
PROCESS_INFORMATION pi = { 0 };
STARTUPINFOEX si = { 0 };
si.StartupInfo.cb = sizeof(si);
si.lpAttributeList = pAttribs;
if (!CreateProcess(NULL, "notepad.exe", NULL, NULL, false, fCreationFlags,
NULL, NULL, &si.StartupInfo, &pi))
throw CErr("CreateProcess", 0); // error if ...ATTRIBUTE_GROUP_AFFINITY
// SetProcessAffinityMask(pi.hProcess,1); // if enabled, notepad's affinity is set
WaitForSingleObject(pi.hProcess, INFINITE);
DeleteProcThreadAttributeList(pAttribs);
return 0;
}发布于 2013-09-07 03:26:48
从文件中还不清楚,但我想我已经弄清楚了。PROC_THREAD_ATTRIBUTE_PREFERRED_NODE只应该与CreateProcess()一起使用。PROC_THREAD_ATTRIBUTE_IDEAL_PROCESSOR和PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY只应该与CreateThread()一起使用。
PROC_THREAD_ATTRIBUTE_PREFERRED_NODE可能会将进程的关联设置为节点所在组中的所有处理器。我无法验证它,因为我的测试系统在两个numa节点上只有12个核。将PROC_THREAD_ATTRIBUTE_PREFERRED_NODE设置为0或1设置与所有核的亲和力。我确实验证了CreateProcess创建的进程的堆栈位于由PROC_THREAD_ATTRIBUTE_PREFERRED_NODE指示的numa节点上。此外,也没有文档化,被传递的节点的大小必须是2个字节。
https://stackoverflow.com/questions/18647965
复制相似问题