BUG: Registry Access from Multiple Threads Might FailLast reviewed: November 26, 1997Article ID: Q176906 |
The information in this article applies to:
SYMPTOMSIf you simultaneously access the same registry key from multiple threads in a single process, an error might occur. For example, if several threads in a carefully designed multi-threaded Win32 application try to open the same registry key using RegOpenKeyEx()in a loop, the function could fail with the following error code of 6:
ERROR_INVALID_HANDLEThis error does not occur across process boundaries. Thus, two single- threaded processes that are competing for the same registry key will not be affected by this bug.
CAUSEThis behavior is intermittent and is the result of a race condition between the threads simultaneously accessing the same registry key.
RESOLUTIONThere are several possible workarounds for this situation:
STATUSMicrosoft has confirmed this to be a bug in the Microsoft products listed at the beginning of this article. We are researching this bug and will post new information here in the Microsoft Knowledge Base as it becomes available.
MORE INFORMATIONThe following sample code illustrates the problem with the RegOpenKeyEx() function. Note that the error only happens intermittently with the following code.
Sample Code#include <windows.h> #include <winbase.h> #include <stdio.h> #define ITERATIONS 1000 VOID ThreadFunc(LPVOID); void main(void) { int numThreads=100; DWORD threadID; int i; for (i=0; i<numThreads; i++) { CreateThread(0, 0,(LPTHREAD_START_ROUTINE) ThreadFunc, 0, 0, &threadID); } return; } VOID ThreadFunc(LPVOID) { LONG rc; HKEY hKey; for(int i=0; i < ITERATIONS; i++) { rc = RegOpenKeyEx( HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft", 0, KEY_ALL_ACCESS, &hKey); if (rc != ERROR_SUCCESS) printf("Iteration(%d): Thread Id: %d, Error=%d\r\n", i, GetCurrentThreadId(), rc); else rc = RegCloseKey(hKey); } } |
Additional query words: regedit problem known occasionally concurrently
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |