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
[22533] Re:Re:Dual CPU 시스템에서의 Multi Thread에 관한 질문입니다.
Sygnus [sygnus] 1541 읽음    2002-11-09 14:40
정말 답변 감사드립니다. 제가 전산과가 아닌 관계로 세마포어의 개념에 대해선 약하거든요. 그러나 아래 세마포어는 여러번 해본 것 중의 하나고 세마포어를 쓰지 않았을 때도 결과는 똑 같았거든요.

void __fastcall TcThread::Execute(void)
{
     WaitForSingleObject(Semaphore,INFINITE);
     UpdateThread();
     ReleaseSemaphore(Semaphore,1,NULL);
}
그러니까 이 부분을

void __fastcall TcThread::Execute(void)
{
   
     UpdateThread();
   
}

이렇게 바꿔도(당연히 세마포어 생성하는 부분도 같이 없애고) 결과는 차이가 없었거든요.

그리고 제가 알기엔 다른 프로세스 다 죽이고 단 하나의 프로세스만 돌리는 방법은 CriticalSection으로 알고 있는데요.

void __fastcall TcThread::Execute(void)
{
     EnterCriticalSection(&CriticalSection);
     UpdateThread();
     LeaveCriticalSection(&CriticalSection);
}

이렇게 했을 때는 분명히 CPU사용율 50%정도를 기록하며 쓰레드 사용하지 않았을 때랑 별반 차이가 없는 결과가 나오더라구요. 즉 시간은 두배 걸리죠. 프로세스 2개 돌렸을 때요. 결과도 1개 프로세스가 결과를 출력하고는 다른 프로세스에서 결과를 출력하더라구요.

  위에 소스보면 아시겠지만 Borland C++ builder 4(정우철)책에 나오는 쓰레드 부분에서 작동부분만 바꾼것이거든요.

따라서 세마포어를 쓰지 않은 상태에서도 결과가 같은데, 이 문제는 어떻게 되는지도 좀 여쭤보고 싶네요.







박지훈.임프 님이 쓰신 글 :
: 세마포어 생성하는 부분이 없는 걸 보니 전체 소스가 아니군요.
: 세마포어를 잘못 쓰신 것 같습니다.
: 세마포어를 기다리는 루틴(WaitForSingleObject)을 쓰레드의 실행 부분 전체에 걸어놓으셨으니,
: 한 쓰레드가 세마포어를 할당받고 실행되면 다른 쓰레드는 세마포어를 기다리는 루틴 뒤로는
: 못들어오게 될 겁니다.
: 그러니까 CPU가 여러개 있는 상황에서 쓰레드를 수백개를 만들어도 동시에 단 하나의 쓰레드만
: 실행되도록 제한이 될 겁니다.
:
: 그럼...
:
:
:
: 김진석 님이 쓰신 글 :
: :   AMD Athlon 1.33Dual을 사용하고 있습니다.  수치 해석 때문에 속도증가를 위해 멀티 쓰레드로 프로그램을 짤려고 하는데 우선 성능 테스트를 위해 간단한 다음과 같은 쓰레드를 실행시켜 보았습니다.
: :
: :
: : //---------------------------------------------------------------------------------------
: :  __fastcall TcThread::TcThread(int TheNum): TThread(true) 
: : {
: :
: :    FreeOnTerminate = true;
: :
: :    iNum = TheNum;
: :
: :    Resume();
: : }
: :
: :
: : void __fastcall TcThread::Execute(void)
: : {
: :     WaitForSingleObject(Semaphore,INFINITE);
: :     UpdateThread();
: :     ReleaseSemaphore(Semaphore,1,NULL);
: : }
: :
: :
: : void __fastcall TcThread::UpdateThread(void)
: : {
: :     int i;
: :
: :     switch(iNum)     //iNum는 쓰레드 Number
: :     {
: :             case 1:
: :             for(i=0; i < 10000000; i++)
: :             {
: :                 l[1]+=i;  // 여기서 ㅣ[]는 전역변수
: :                 l[1]+=cos(i);
: :                 l[1]-=sin(i);
: :             }
: :             break;
: :             case 0:
: :             for(i=0; i < 10000000; i++)
: :             {
: :                 l[0]+=i;
: :                 l[0]+=cos(i);
: :                 l[0]-=sin(i);
: :             }
: :             break;
: :
: :
: :     }
: :
: : }
: : //---------------------------------------------------------------------------------
: :
: :   이렇게 한 다음 작동부에서
: :  
: :  TcThread *T;
: :  T=newTcThread(1);
: :
: :  하면 1이라는 인자를 같는 쓰레드가 구동이 되거든요.
: :
: : 일단은 듀얼이라 쓰레드 2개가 도는 것이 가장 효율이 나을 것 같아서 인자를 0,1만 하도록 해서 쓰레드를 2개 만든 다음 프로그램을 구동해 봤습니다.
: :
: :  그런데 쓰레드 1개 돌렸을 땐 10초 걸리는데 반해 쓰레드 2개 돌리면 40초 걸립니다. Xp및 Win2000에서요. 전혀 이득이 없죠. 리소스 측정기에서 보면 쓰레드 1개 돌릴땐 CPU사용율 50%넘지 않습니다. 쓰레드 2개 돌릴 땐 100%를 가리킵니다. 그런데도 루프를 완료하는 속도가 전혀 나아진 것이 없는 겁니다.
: : 
: :  그런데 98에서 돌리면 1개 돌렸을 땐 10초 2개 돌리면 15-6초 걸리고 이는 조금의 이득이 있네요.
: : 다중 시피유 지원해주는 XP나 2000에선 상태가 않 좋은데 오히려 98에서 멀티 쓰레드가 더 효율이 있는 이유를 모르겠네요.
: :
: :   혹시 왜 이런 결과가 나타나는지 알 수 있을까요? 제가 쓰레드를 잘못 사용한 것인가요? 아님 듀얼에서는 또 다른 옵션을 설정해 주어야 하는 것인가요.
: :
: :   답변해 주시면 정말 감사하겠습니다. 

+ -

관련 글 리스트
22491 Dual CPU 시스템에서의 Multi Thread에 관한 질문입니다. 김진석 803 2002/11/07
22531     Re:Dual CPU 시스템에서의 Multi Thread에 관한 질문입니다. 박지훈.임프 1023 2002/11/09
22533         Re:Re:Dual CPU 시스템에서의 Multi Thread에 관한 질문입니다. Sygnus 1541 2002/11/09
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.