gpt4 book ai didi

c++ - 连接到 64 位机器的 RegConnectRegistry 问题

转载 作者:太空狗 更新时间:2023-10-29 22:53:25 26 4
gpt4 key购买 nike

在 64 位版本的 Windows 上连接到性能注册表时,我看到了一件奇怪的事情。整个程序停滞,调用堆栈变得不可读。长时间超时后,连接尝试中止,一切恢复正常。

唯一的解决办法是确保一次只有一个线程查询远程注册表,除非远程机器是 32 位的 Windows XP、2003、2000,那么你可以使用任意多的线程。

有没有人从技术上解释为什么会发生这种情况?我花了 2-3 天时间在网上搜索,但一无所获。

这里是一个测试程序,先用一个线程运行(连接64位Windows),然后去掉tmain中的注释,用4个线程运行。用一个线程运行它按预期工作,用 4 个线程运行,在停顿一段时间后返回 ERROR_BUSY (dwRet == 170)。

运行程序前记得在RegConnectRegistry中正确设置远程机器。

#define TOTALBYTES    8192
#define BYTEINCREMENT 4096

void PerfmonThread(void *pData)
{
DWORD BufferSize = TOTALBYTES;
DWORD cbData;
DWORD dwRet;

PPERF_DATA_BLOCK PerfData = (PPERF_DATA_BLOCK) malloc( BufferSize );
cbData = BufferSize;

printf("\nRetrieving the data...");

HKEY hKey;
DWORD dwAccessRet = RegConnectRegistry(L"REMOTE_MACHINE",HKEY_PERFORMANCE_DATA,&hKey);

dwRet = RegQueryValueEx( hKey,L"global",NULL,NULL,(LPBYTE) PerfData, &cbData );
while( dwRet == ERROR_MORE_DATA )
{
// Get a buffer that is big enough.

BufferSize += BYTEINCREMENT;
PerfData = (PPERF_DATA_BLOCK) realloc( PerfData, BufferSize );
cbData = BufferSize;

printf(".");
dwRet = RegQueryValueEx( hKey,L"global",NULL,NULL,(LPBYTE) PerfData,&cbData );
}
if( dwRet == ERROR_SUCCESS )
printf("\n\nFinal buffer size is %d\n", BufferSize);
else
printf("\nRegQueryValueEx failed (%d)\n", dwRet);

RegCloseKey(hKey);
}

int _tmain(int argc, _TCHAR* argv[])
{
_beginthread(PerfmonThread,0,NULL);
/* _beginthread(PerfmonThread,0,NULL);
_beginthread(PerfmonThread,0,NULL);
_beginthread(PerfmonThread,0,NULL);
*/

while(1)
{

Sleep(2000);
}
}

最佳答案

这不是一个真正的答案,而是一个建议。即使您只是查询注册表(而不是写入),我想知道您是否正在使用多线程产生某种死锁。

缺少 Windows 开发或测试环境,请采纳此建议的值(value):也许您可以在注册表调用周围使用互斥体...可以缓解任何死锁情况,如果这确实是问题。

祝你好运。

关于c++ - 连接到 64 位机器的 RegConnectRegistry 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2402557/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com