스레드 시간측정 질문좀요.
Soeun
제가 숫자 n을 입력하면 n만큼 스레드를 만들고 랜덤으로 받은 배열을 n만큼 부분별로 나눠서 스레드가 각자 부분별로 퀵소트를 한다음에 마지막 스레드에서 부분별로 정렬한 배열을 합치는 소스인데 시간측정을 할려고 하는데 계속 0이 나오네요 ; 그래서 정렬이 안됬나 싶어서 출력하면 정렬은 되고 조금 힌트나 조언좀 부탁드릴께요.
#includestdio.h
#includewindows.h
#includetchar.h
#includetime.h
#define MAX_THREADS (10)
DWORD *arr;
DWORD num; //배열을 스레드의 수만큼 나누기 위한 기준
DWORD n; //스레드의 갯수
DWORD count=0; //스레드 카운트
float time_data=0;
CRITICAL_SECTION cs; //공유자원에 동시에 접근하는것을 막기위한 크리티컬섹션
DWORD WINAPI ThreadProc(LPVOID lpParam); //스레드에서 돌아갈 함수 선언
DWORD partition(DWORD,DWORD); //퀵소트에서 피봇값을 정해서 위치를 리턴해주는 함수
void quicksort(DWORD,DWORD); //분할하고 정렬하는 함수
void merge(DWORD,DWORD,DWORD); //부분별로 정렬된 배열을 합치는 함수
int _tmain(int argc,TCHAR *argv[]){
srand((unsigned)time(NULL)); //배열에 임의의 숫자를 지정해주기 위해서
DWORD cnt=0;
DWORD *ThreadID;
HANDLE *hThread;
int j;
DWORD Result=0;
scanf(%d,&n); // 스레드의 갯수 입력
ThreadID=(DWORD*)malloc(sizeof(DWORD)*n); //입력한 숫자 n만큼 스레드 ID 동적할당
hThread=(HANDLE*)malloc(sizeof(HANDLE)*n); //입력한 숫자 n만큼 스레드의 핸들 동적할당
arr=(DWORD*)calloc(10000001,sizeof(int)); //배열 동적할당
for(j=1;j10000001;j++) arr[j]=rand()%10000000; //배열에 임의의 수 대입
num=10000000/n;
InitializeCriticalSection(&cs);
while(1){ // 스레드 만드는 과정
if(cnt == n) break;
hThread[cnt] =
CreateThread(
NULL,0,ThreadProc,
(LPVOID)cnt,
0,
&ThreadID[cnt]);
cnt++;
}
Sleep(1000);
for(DWORD i=0; in; i++) // 스레드가 모든 작업을 마치고 리턴값을 받음
{
GetExitCodeThread(hThread[i],&Result);
CloseHandle(hThread[i]);
}
for(j=1;j1000;j++) printf(%d ,arr[j]);
DeleteCriticalSection(&cs);
return 0;
}
DWORD WINAPI ThreadProc(LPVOID lpParam){
EnterCriticalSection(&cs);
DWORD start,end,j;
start=count*num+1;
end=(count+1)*num;
if(count==n-1) end=10000000;
quicksort(start,end);
count++;
if(count==n) for(j=0;jn-1;j++) // 마지막 스레드가 돌아갈때 부분별로 정렬된 스레드를 다 합침
{
if(j==n-2) merge(1,(j+1)*num,10000000);
else merge(1,(j+1)*num,(j+2)*num);
}
LeaveCriticalSection(&cs);
return *arr;
}
DWORD partition(DWORD start,DWORD end)
{
DWORD x,i,j,temp;
x=arr[end];
i=start-1;
for(j=start;jend;j++)
{
if(arr[j]=x)
{
i++;
temp=arr[i];
arr[i]=arr[j];
arr[j]=temp;
}
}
temp=arr[i+1];
arr[i+1]=arr[end];
arr[end]=temp;
return i+1;
}
void quicksort(DWORD start,DWORD end)
{
DWORD q;
if(startend)
{
q=partition(start,end);
quicksort(start,q-1);
quicksort(q+1,end);
}
}
void merge(DWORD start,DWORD mid,DWORD end)
{
DWORD i,j,t,*tmp;
tmp=(DWORD*)malloc(sizeof(DWORD)*(end-start+1));
i=start;
j=mid+1;
t=0;
while(i=mid&&j=end){
if(arr[i]=arr[j]){
tmp[t]=arr[i];
t++;
i++;
}
else{
tmp[t]=arr[j];
t++;
j++;
}
}
while(i=mid){
tmp[t]=arr[i];
t++;
i++;
}
while(j=end){
tmp[t]=arr[j];
t++;
j++;
}
i=start;
t=0;
while(i=end)
{
arr[i]=tmp[t];
i++;
t++;
}
}