관리 메뉴

ㄴrㅎnㅂrㄹrㄱi

CreateMutex(A) 본문

API 관련/Win32 API 함수

CreateMutex(A)

님투 2007. 11. 8. 22:43
반응형

CreateMutex(A)

뮤텍스 오브젝트를 작성합니다.

HANDLE CreateMutexA(
    PSECURITY_ATTRIBUTES psa, // 시큐러티 지정자
    BOOL    bInitialOwner,    // 소유권 지정 플래그
    PCTSTR  pszMutexName      // 오브젝트의 이름
);

KERNEL32.DLL

인수

psa

오브젝트의 보호 속성을 설정한다 SECURITY_ATTRIBUTES 구조체의 주소를 지정합니다.이 구조체에, child process에 핸들을 계승할지의 정보를 격납해 둡니다.

0 (NULL) (을)를 지정하면 핸들을 계승하지 않습니다.

Windows NT/2000/XP: SECURITY_ATTRIBUTES 구조체의 lpSecurityDescriptor 멤버로 시큐러티 기술자를 설정합니다. 0 (NULL) (을)를 지정하면 디폴트의 시큐러티 기술자가 사용됩니다.

Windows 95/98/Me: SECURITY_ATTRIBUTES 구조체의 lpSecurityDescriptor 멤버는 무시됩니다.

bInitialOwner

초기 상태의 뮤텍스 오브젝트의 소유권을 작성 스렛드에게 줄지를 지정합니다. 1 (TRUE) (을)를 지정하면 오브젝트의 소유권은 작성 스렛드에 건너, 오브젝트는 논시그날 상태가 됩니다. 0 (FALSE) (을)를 지정하면, 소유권을 요구하지 않습니다.

pszMutexName

뮤텍스 오브젝트를 식별하는 이름의 문자열에의 포인터를 지정합니다.이름에는 backslash(\) 이외의 임의의 문자를 사용할 수 있습니다.또, 대문자·소문자는 구별됩니다.최대 문자열 사이즈는 260 (MAX_PATH) 입니다.

지정한 이름의 뮤텍스 오브젝트가 벌써 작성되고 있는 경우에는, 기존의 오브젝트에 대해서 MUTEX_ALL_ACCESS 액세스를 요구합니다.이 때, bInitialOwner 파라미터는 무시됩니다.또, psa 파라미터가 가리킨다 SECURITY_ATTRIBUTES 구조체의 시큐러티 기술자는 무시됩니다.

0 (NULL) (을)를 지정하면, 이름 없음의 오브젝트가 작성됩니다.

지정한 이름이 벌써 작성되고 있는 뮤텍스 이외의 이름 첨부의 커넬 오브젝트의 이름과 일치하면, 함수는 실패합니다.이것은, 커넬 오브젝트가 같은 네임 스페이스(이름 공간)를 공유하고 있기 위해서 일어납니다.

터미널 서비스: 터미널 서버에서는, 글로벌 또는 세션의 네임 스페이스(이름 공간)에서 명시적으로 뮤텍스 오브젝트를 관리시키기 위해서, "Global\" 또는 "Local\" 의 프레픽스를 붙일 수 있습니다.나머지의 이름은, backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.

Windows NT/2000/XP: 고속의 유저 변환은 터미널 서비스 세션을 사용해 행해집니다.최초의 유저에서는 세션 0 하지만, 다음의 유저에서는 세션 1 하지만, 과 같이 사용됩니다.어플리케이션이 복수의 유저를 서포트할 수 있도록 하려면 , 커넬 오브젝트의 이름은, 터미널 서비스의 가이드 라인에 따라서 않으면 안됩니다.

Windows 2000: 터미널 서비스가 실행되어 있지 않은 경우에는, "Global\" 및 "Local\" 의 프레픽스는 무시됩니다.나머지의 이름은, backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.

Windows NT 4.0 이전: backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.

Windows 95/98/Me: backslash 「 \ 」이외의 모든 문자를 사용할 수 있습니다.공문자열 "" 도, 오브젝트의 이름으로서 유효합니다.

반환값

성공하면, 작성된 뮤텍스 오브젝트의 핸들이 돌아갑니다.벌써 존재하는 오브젝트의 핸들이 돌려주어졌을 경우, 직후에 실행했다 GetLastError 함수는 183 (ERROR_ALREADY_EXISTS) (을)를 돌려줍니다.

실패하면 0 (NULL) 하지만 돌아갑니다.확장 에러 정보를 취득하려면 , GetLastError 함수를 사용합니다.

해설

뮤텍스 오브젝트는, 스렛드에 소유되고 있는 경우는 논시그날 상태에, 어느 스렛드에도 소유되어 있지 않은 경우는 시그널 상태가 됩니다.

기존의 뮤텍스에 대해서 소유권을 요구하려면 , 대기 함수 ( WaitForSingleObject 함수 등) (을)를 사용합니다.이 때, 뮤텍스가 시그널 상태(어느 스렛드에도 소유되어 있지 않다)라면, 즉시 소유권이 주어집니다.뮤텍스가 논시그날 상태(몇개의 스렛드에 소유되고 있다)라면, 그 소유 스렛드가 소유권을 해방할 때까지 대기합니다.그리고 소유권이 해방되면, 대기중의 스렛드 중 하나에 소유권이 주어져 뮤텍스는 논시그날 상태가 되어, 대기 함수는 제어를 돌려줍니다.뮤텍스를 소유할 수 있는 스렛드는, 한 번에 하나 뿐입니다.소유권을 해방하려면 , ReleaseMutex 함수를 사용합니다.

복수의 프로세스로 CreateMutex 함수를 사용해, 같은 이름의 뮤텍스를 작성할 수 있습니다.이 때, 최초로 함수를 호출한 프로세스에서는 실제로 뮤텍스가 작성되어2 번째 이후의 프로세스에서는 기존의 뮤텍스의 핸들이 오픈됩니다.이 수법을 사용할 때는, bInitialOwner 파라미터에 0 (FALSE) (을)를 지정할 필요가 있습니다.그렇게 하지 않으면 어느 스렛드가 소유권을 갖고 있는지의 판별이 어려워질 우려가 있습니다.

핸들을 클로우즈 하려면 , CloseHandle 함수를 사용합니다.프로세스의 종료시에는, 시스템이 자동적으로 핸들을 클로우즈 합니다.마지막 핸들이 클로우즈 되면, 뮤텍스 오브젝트는 파기됩니다.

대응 정보

Windows 95 이후 / Windows NT 3.1 이후

반응형

'API 관련 > Win32 API 함수' 카테고리의 다른 글

CreatePopupMenu  (0) 2007.11.08
CreatePolygonRgn  (0) 2007.11.08
CreateMenu  (0) 2007.11.08
CreateFontIndirect(A)  (0) 2007.11.08
CreateFont(A)  (0) 2007.11.08
Comments