DLL에 명시 적으로 링크를 수행하는 코드를 작성 중입니다. 이 코드는 .lib 파일로 암시 적으로 연결하는 대신 내 사용자에게 제공됩니다. 순간 내 계획 코드는 다음과 같습니다이 코드에 동기화를 추가해야합니까?
void DisableModule(int Module)
{
typedef void (*DisableModuleProc)(int);
static DisableModuleProc proc = NULL;
if (proc == NULL)
proc = (DisableModuleProc)GetProcAddress(hModule, "DisableModule");
proc(Module);
}
이 양식의 많은 기능이있다, 나는이 질문의 목적을 위해 검사 오류를 절제했다.
내 스레드 보안 문제가 있습니다. 이 함수는 여러 스레드에서 동시에 호출 될 수 있습니다. 분명히 정적 변수 _DisableModule
에 경주가 있습니다. 내 생각에 _DisableModule
은 기계 단어 경계 (대상에 따라 32 비트 또는 64 비트 경계)에 정렬되므로 절도가 발생할 수 없으므로 인종은 양성입니다. GetProcAddress
이 필요한 것보다 더 많이 호출 될 수도 있지만 프로그램의 정확성에 영향을 미치지는 않습니다.
내 분석이 맞습니까?
호출 된 함수 (_DisableModule) 자체가 스레드 안전합니까? 또한 밑줄과 대문자로 시작하는 식별자는 예약되어 있습니다. – zvrba
@zvrba 예, 가져온 함수는 스레드 세이프입니다. 예약 된 식별자에 대한 조언을 많이 주셔서 감사합니다. 나는 C에 능통하지 않다. –
프로세서 유형에 따라 다르지만 x86 또는 x64에서는 정상적으로 작동합니다. ARM에 대해서는 확실하지 않지만 메모리 모델이 약합니다. 스레드를 사용할 때 항상 '미안한 것보다 안전합니다'를 호출하는 것이 현명합니다. –