|
정말 답변 감사드립니다. 제가 전산과가 아닌 관계로 세마포어의 개념에 대해선 약하거든요. 그러나 아래 세마포어는 여러번 해본 것 중의 하나고 세마포어를 쓰지 않았을 때도 결과는 똑 같았거든요.
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에서 멀티 쓰레드가 더 효율이 있는 이유를 모르겠네요.
: :
: : 혹시 왜 이런 결과가 나타나는지 알 수 있을까요? 제가 쓰레드를 잘못 사용한 것인가요? 아님 듀얼에서는 또 다른 옵션을 설정해 주어야 하는 것인가요.
: :
: : 답변해 주시면 정말 감사하겠습니다.
|