C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[61974] Re:Re:Re:Re:Re:Re:Re:Re:개념에 대해 조언 부탁드립니다
문의드립니다 [] 1153 읽음    2010-07-23 09:47
어떤 부분이 우험한건가요??
전 이해가 잘 안되서요...ㅠ


초보대왕 님이 쓰신 글 :
: -- 그런다면 두 번째 예제의 경우 뮤텍스 사용 방법이 별루 좋지 않은거죠??
: -- 두번째의 경우 좀더효율적으로 개선하는 방법으로 이벤트말고 다른건 없을까요??
:
: 뮤텍스로 정확히 무슨 기능을 구현한 건지는 모르겠지만, 첫번째 두번째 다 안좋습니다.
: 뮤텍스를 아주 위험하게 사용하고 있네요.
:
: 문의드립니다 님이 쓰신 글 :
: : HANDLE mutexHandle;
: : int num = 0;
: :
: : DWORD WINAPI thread1(void *p)
: : {
: :     WaitForSingleObject(mutexHandle, INFINITE);   //여기 지나면서 비신호 상태가 된다 
: :     num++;
: :
: :     printf("Thread = %d\n", num);
: :     //   ReleaseMutex(mutexHandle);  //여기가 지나면 다시 신호 상태가 된다...
: :     while(1) {
: :         if ((num % 5) == 0) {
: :             ReleaseMutex(mutexHandle);  //여기가 지나면 다시 신호 상태가 된다...
: :             printf("ReleaseMutex가 호출되었습니다..\n");
: :         }
: :     }
: :
: :     return 0;
: : }
: :
: : int main()
: : {
: :     HANDLE Cthread;
: :     mutexHandle = CreateMutex(0, FALSE, 0);
: :
: :     while(1) {
: :         Cthread = CreateThread(0, 0, thread1, 0, 0, 0);
: :         Sleep(500);
: :     }
: :
: :     //  WaitForMultipleObjects(2, Cthread, TRUE, INFINITE);
: :     WaitForSingleObject(Cthread, INFINITE);
: :     CloseHandle(Cthread);
: :     CloseHandle(mutexHandle);
: :
: :     getchar();
: : }
: : 이경우엔 while문이 무한 반복을 도는 상태에서 ReleaseMutex()의 위치에 따라 연속적으로 글자가 출력되기도하고
: : 멈춰있기도 하네요..
: :
: : 근데요...
: :
: : void PrintfFunc(int num)
: : {
: :     WaitForSingleObject(mutexHandle, INFINITE);   //여기 지나면서 비신호 상태가 된다 
: :     printf("Thread = %d\n", num);
: :     //   ReleaseMutex(mutexHandle);  //여기가 지나면 다시 신호 상태가 된다...
: :     if ((num % 5) == 0) {
: :         ReleaseMutex(mutexHandle);  //여기가 지나면 다시 신호 상태가 된다...
: :         printf("ReleaseMutex가 호출되었습니다..\n");
: :     }
: : }
: :
: : DWORD WINAPI thread1(void *p)
: : {
: :     num++; 
: :     //   ReleaseMutex(mutexHandle);  //여기가 지나면 다시 신호 상태가 된다...
: :     while(1) {
: :         PrintfFunc(num);
: :         Sleep(1000);
: :     }
: :
: :     return 0;
: : }
: :
: : int main()
: : {
: :     HANDLE Cthread;
: :     mutexHandle = CreateMutex(0, FALSE, 0);
: :
: :     while(1) {
: :         Cthread = CreateThread(0, 0, thread1, 0, 0, 0);
: :         Sleep(500);
: :     }
: :
: :     //  WaitForMultipleObjects(2, Cthread, TRUE, INFINITE);
: :     WaitForSingleObject(Cthread, INFINITE);
: :     CloseHandle(Cthread);
: :     CloseHandle(mutexHandle);
: :
: :     getchar();
: : }
: :
: : 이런식으로 함수 호출하는 방식으로 변경하면 위의 결과와는 다른 결과가 출력이되네요,,
: : PrintfFunc()함수가 종료가 되면서 뮤텍스가 자동으로 반환된것 같은데 맞나요??
: : 그런다면 두 번째 예제의 경우 뮤텍스 사용 방법이 별루 좋지 않은거죠??
: :
: : 두번째의 경우 좀더효율적으로 개선하는 방법으로 이벤트말고 다른건 없을까요??
: :
: :
: :
: : Lyn 님이 쓰신 글 :
: : : Wait와 Release 는 반드시 같은 Thread에서 호출하여야 합니다 =_=a
: : :
: : : 한 Thread 에서 아무리 Wait 를 반복한다 해도, 다른 Thread가 잠기진 않으며, 아무리 Release 를 반복한다 해도 잠긴 Thread가 풀리지 않습니다.
: : :
: : : 원하는걸 구현하려면 Mutex가 아니라 Event 를 써야겠네요.
: : :
: : : 문의드립니다 님이 쓰신 글 :
: : : : HANDLE mutexHandle;
: : : : DWORD WINAPI thread1(void *p)
: : : : {
: : : :     static int num = 0;
: : : :     num++;
: : : :
: : : :     printf("Thread = %d\n", num);
: : : :
: : : :     if ((num % 5) == 0) {
: : : :         ReleaseMutex(mutexHandle);  //여기가 지나면 다시 신호 상태가 된다...
: : : :     }
: : : :
: : : :     return 0;
: : : : }
: : : :
: : : : DWORD WINAPI thread2(void *p)
: : : : {
: : : :      WaitForSingleObject(mutexHandle, INFINITE);   //여기 지나면서 비신호 상태가 된다
: : : :      printf("Thread2가 호출되었습니다..\n");
: : : :
: : : :      return 0;
: : : : }
: : : :
: : : : int main()
: : : : {
: : : :     HANDLE Cthread[2];
: : : :     mutexHandle = CreateMutex(0, FALSE, 0);
: : : :
: : : :     while(1) {
: : : :         Cthread[0] = CreateThread(0, 0, thread1, 0, 0, 0);
: : : :         Cthread[1] = CreateThread(0, 0, thread2, 0, 0, 0);
: : : :         Sleep(500);
: : : :     }
: : : :
: : : :     WaitForMultipleObjects(2, Cthread, TRUE, INFINITE);
: : : :     CloseHandle(Cthread[0]);
: : : :     CloseHandle(mutexHandle);
: : : :
: : : :     getchar();
: : : : }
: : : :
: : : : 위의 예제처럼 구현을 했을 경우
: : : : thread2가 처음 호출된 뒤
: : : : WaitForSingleObject(mutexHandle, INFINITE); 지나는 순간 비신호 상태로 바껴서
: : : : ReleaseMutex(mutexHandle);가 호출되기 전까지는 무한 대기 상태에 놓여져 있어야 되는거아닌가요?
: : : :
: : : : 그런데 실행해 보니 두 스레드 모드 각자의 printf문을 계속 출력하고 있습니다...
: : : : 제가 무슨 착각에 빠진건가요???
: : : :
: : : :
: : : :
: : : : 초보대왕 님이 쓰신 글 :
: : : : : 먼저 동기화 처리에 있어서 State Variable 은 일반적인 용어가 아닙니다.
: : : : : 듣는 사람에게 혼란만 줄 뿐이죠
: : : : :
: : : : : APC 라는 것도 복잡한 멀티쓰레드 프로그램에서조차 잘 사용하지 않으니까, 일단 잊으시구요, 질문하신
: : : : :
: : : : : -- 전 뮤텍스를 걸면 다른스레드의 접근이 완전히 차단 되는거라 믿었는데
: : : : : -- 예외의 경우가 있다네요
: : : : : -- ......
: : : : : -- 뮤텍스 lock을 걸어도 다른 스레의 침입이 가능한 경우가 어떤경우인가요?
: : : : : -- 변수를 전역으로 쓴다든가 뭐 그런경우도 해당이 되나요??
: : : : :
: : : : : 아니요. 그리고 뮤텍스에 lock 을 정확하게 걸었다면 다른 스레의 침입은 불가능합니다.
: : : : : 그래도 다른 스레의 침입이 가능하다면, lock 을 정확하게 걸지 않은 않았거나,
: : : : : lock 오브젝트가 어떤 이유에서 유효하지 않게 된 것이지요.
: : : : :
: : : : :
: : : : : 문의드립니다 님이 쓰신 글 :
: : : : : : ASync Procedure Call 에 대해 찾아보니
: : : : : : APC 는 Asynchronous Procedure Call 의 약자로서, 비동기 함수 호출 메커니즘을 의미 한다라고 나와있는데
: : : : : : 전 왜 이 말이 이해가 되질 않는 걸까요..ㅠㅜ 비동기 함수 호출하는 것을 APC라고 하는 건가요??
: : : : : :
: : : : : : VOID CALLBACK APCProc( ULONG_PTR );   
: : : : : : 이런 함수를 호출하는게 APC라는 건가요??
: : : : : :
: : : : : : 죄송하지만 ASync Procedure Call에 대한 설명 부탁드립니다
: : : : : : 그리고 State Variable가 뭔가요?? 검색해 보니깐 수학 공식만 엄청 뜨던데...ㅜ
: : : : : :
: : : : : : CreateMutexA(
: : : : : :     __in_opt LPSECURITY_ATTRIBUTES lpMutexAttributes,
: : : : : :     __in     BOOL bInitialOwner,
: : : : : :     __in_opt LPCSTR lpName
: : : : : :     );
: : : : : :
: : : : : : 뮤텍스 매개변수 값은 아닌듯 한데요...
: : : : : :
: : : : : : 근데 전 뮤텍스 안에서 하는 일이라곤 Q(push())안에 데이터를 집어넣는 일만 합니다..
: : : : : : 이런 경우도 문제가 발생할 수 있을까요??
: : : : : :
: : : : : :
: : : : : :
: : : : : : Lyn 님이 쓰신 글 :
: : : : : : : 뮤텍스 안에서 ASync Procedure Call 을 할 경우 무제가 생길 수 있습니다.
: : : : : : :
: : : : : : : Win2008 이후부터는 이것을 해결하기위해 State Variable 이 있구요.
: : : : : : :
: : : : : : :
: : : : : : : 문의드립니다 님이 쓰신 글 :
: : : : : : : : 뮤텍스를 생성한 후 lock을 걸었습니다...
: : : : : : : :
: : : : : : : : 전 뮤텍스를 걸면 다른스레드의 접근이 완전히 차단 되는거라 믿었는데
: : : : : : : : 예외의 경우가 있다네요
: : : : : : : :
: : : : : : : : 그래서 그 경우를 인터넷을 열심히 뒤져 봤지만 그런얘기는 하나도 없더라구요
: : : : : : : : 콘솔환경에서 제작했구요 간단한겁니다
: : : : : : : :
: : : : : : : : 그냥 테스트로 main()함수 하나 만들고  스레드 2개 생성한 뒤에 전역으로 배열하나 만들어서
: : : : : : : :
: : : : : : : : 두 개의 스레드에서 하나는 배열에 데이터를 넣고 다른 하나는 배열에 있는 데이터를 빼서 처리하는 역활을
: : : : : : : : 하는 형식입니다...
: : : : : : : :
: : : : : : : : 뮤텍스 lock을 걸어도 다른 스레의 침입이 가능한 경우가 어떤경우인가요?
: : : : : : : : 변수를 전역으로 쓴다든가 뭐 그런경우도 해당이 되나요??
: : : : : : : :
: : : : : : : : 스레드 내부는
: : : : : : : : while(1) {
: : : : : : : :    for () {
: : : : : : : :      뮤텍스.lock()
: : : : : : : :      //배열에 데이터입력
: : : : : : : :      뮤텍스.unlock();
: : : : : : : :    }
: : : : : : : : }
: : : : : : : :
: : : : : : : : 이런형태로 작성하였습니다....

+ -

관련 글 리스트
61963 개념에 대해 조언 부탁드립니다 문의드립니다 1190 2010/07/21
61964     Re:개념에 대해 조언 부탁드립니다 Lyn 1151 2010/07/21
61965         Re:Re:개념에 대해 조언 부탁드립니다 문의드립니다 1188 2010/07/21
61966             Re:Re:Re:개념에 대해 조언 부탁드립니다 초보대왕 1143 2010/07/21
61967                 Re:Re:Re:Re:개념에 대해 조언 부탁드립니다 문의드립니다 1150 2010/07/22
61968                     Re:Re:Re:Re:Re:개념에 대해 조언 부탁드립니다 Lyn 1047 2010/07/22
61970                         Re:Re:Re:Re:Re:Re:개념에 대해 조언 부탁드립니다 문의드립니다 1182 2010/07/22
61973                             Re:Re:Re:Re:Re:Re:Re:개념에 대해 조언 부탁드립니다 초보대왕 1125 2010/07/22
61974                                 Re:Re:Re:Re:Re:Re:Re:Re:개념에 대해 조언 부탁드립니다 문의드립니다 1153 2010/07/23
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.