스레드 4

WaitForSingleObject의 첫 인수가 스레드 핸들인 경우 유의점

첫 인수가 스레드 핸들일 경우, 스레드가 종료하거나 두번째 인수인 time-out 시간에 도달하면 리턴하게 된다. 그런데 조금 유의할 게 둘이상의 스레드가 대기하는 경우... 타겟 스레드 종료시점이나 타임아웃 시점에 대기순서대로의 실행을 보장해주지 못한다. 이를 테면 WaitForSingleObject(h타겟스레드, 타임아웃); 이런 대기코드가 존재하고 대기 스레드 1이 먼저 대기상태에 들어가고 이후 대기 스레드 2가 대기상태에 들어가고 조금 있다가 대기 스레드 3이 대기상태에 들어간 후 타겟 스레드가 실행이 종료되면 대기상태에 가장 먼저 들어간 스레드 1이 먼저 실행되진 않는다. 대기 스레드 1, 대기 스레드 2, 대기 스레드 3 이런 순으로 항상 실행되지 않는다. 여러 번 테스트해 봤는데 거의 무작위..

API 2012.03.17

뮤텍스와 세마포어,,, WAIT_ABANDONED 발생 여부

WAIT_ABANDONED 이 리턴값은 WaitForSingleObject 기타 등등 대기 함수에서 동기화 객체를 소유한 스레드가 terminate되거나 exit 된 경우 발생하게 된다. 크리티컬 섹션 같은 동일 프로세스 내에서만 통용되는 동기화 함수는 이런 기능?을 제공하지 않으므로 소유 스레드가 락 상태가 되면 나머지 기다리는 스레드들은 무한정 대기해버리는 문제가 발생한다. 뮤텍스는 저 기능 하나만으로도 그 동안 매우 유용하게 프로세스 간이나 스레드 간에 잘 사용했다. 그런데 카운트 제한 때문에 세마포어를 사용할 일이 있어서 테스트해보았는데 뮤텍스처럼 불측의 종료시 WAIT_ABANDONED 결과값이 발생하지 않았다. 뮤텍스처럼 이름을 붙이는 것도 가능하고 프로세스 간에도 전역적으로 통용되니 비슷할 ..

API 2012.03.06

전역 스레드 핸들을 다룰시 유의사항

HANDLE hThread=CreateThread~~~; CloseHandle(hThread); 이런식으로 쓰이는데,,, 전역변수 핸들을 선언하는 경우 좀 유의해야 할 듯 하다. HANDLE g_ahThread[64]={NULL,}; g_ahThread[index]=CreateThread~~~; ... ... .. TerminateThread(g_ahThread[index], 0); CloseHandle(g_ahThread[index]); 형식으로 쓰이는데. 핸들을 닫은 후 g_ahThread[index]=NULL;이라는 코딩을 해주는게 좋다. 스레드의 핸들은 조사해 보니 0x7bc 이런식으로 아주 낮은 자리수를 취하고 있었다. 어떤 스레드를 닫은 경우, 그 핸들 번호가 새로 생성된 스레드에 할당되는 일..

API 2010.03.16

TerminateThread사용시 생존여부 판단 주의(GetExitCodeThread 사용시 리턴값 주의)

TerminateThread 로 강제종료시킬 경우,,, 스레드가 종료작업을 모두 마친 후에 리턴되지 않고, 커널에 종료시키라는 신호만 보내고 바로 리턴하는 듯하다.(이를테면 비동기적 처리) DWORD WINAPI ThreadFun(LPVOID lp) { Sleep(3000); return 0; } { DWORD tid; HANDLE hOneThread=CreateThread(NULL, 0, ThreadFun, NULL, 0, &tid); DWORD dwExitCode=NULL;TerminateThread(hOneThread, 0x9999); BOOL bSuc=GetExitCodeThread(hOneThread, &dwExitCode); char szText[256]={0}; wsprintfA(szText..

API 2010.03.16