#include #include #define WAIT_TIME 1 #define MAX 15 DWORD WINAPI WorkerThreadFunc (LPVOID lpThreadParam); class RangeType { public: int start, end; int size(void) { return end - start + 1; } }; int Data[] = {5, 8, 3, 6, 2, 1, 9, 7, 4, 0, 14, 12, 11, 13, 10}; void PrintArray (int* d, int size) { int i; for (i = 0; i < size; i++) cout << d[i] << " "; cout << endl; } void Merge (RangeType s1, RangeType s2) { int i, j, k, entries, s1_end; int *temp_data; entries = (s2.end - s1.start + 1); temp_data = (int*) malloc(sizeof(int) * entries); memcpy(temp_data, &(Data[s1.start]), sizeof(int) * entries); i = 0; j = s1.size(); k = s1.start; s1_end = s1.size() - 1; while ((i <= s1_end) && (j <= entries-1)) { if (temp_data[i] < temp_data[j]) { Data[k] = temp_data[i]; i++; } else { Data[k] = temp_data[j]; j++; } k++; } if (i <= s1.end) { memcpy(&(Data[k]), &(temp_data[i]), sizeof(int) * (s1.size() - i)); } } void MergeSort (RangeType sub) { if (sub.start < sub.end) { RangeType left_sub, right_sub; int middle; middle = sub.start + (sub.end - sub.start) / 2; left_sub.start = sub.start; left_sub.end = middle; right_sub.start = middle + 1; right_sub.end = sub.end; MergeSort(left_sub); MergeSort(right_sub); Merge(left_sub, right_sub); } } void main (void) { HANDLE hWorkerThread[MAX]; DWORD dwWorkerThreadID[MAX]; DWORD dwPrimaryThreadID; int i, ThreadCount; RangeType range; dwPrimaryThreadID = GetCurrentThreadId(); for (i=0; i < MAX; i++) { hWorkerThread[i] = CreateThread(NULL, 0, WorkerThreadFunc, (LPVOID) i, 0, &(dwWorkerThreadID[i])); if (hWorkerThread[i] == NULL) { cout << "Worker thread " << i << " failed in creation!" << endl; Sleep(WAIT_TIME); break; } else { cout << "Worker thread " << dwWorkerThreadID[i] << " spawned" << endl; Sleep(WAIT_TIME); } } if (i <= MAX) { ThreadCount = i; } else { ThreadCount = MAX; } WaitForMultipleObjects(ThreadCount, hWorkerThread, TRUE, INFINITE); for (i=0; i < ThreadCount; i++) { CloseHandle(hWorkerThread[i]); cout << "Worker thread " << dwWorkerThreadID[i] << " handle closed" << endl; Sleep(WAIT_TIME); } PrintArray(Data, MAX); range.start = 0; range.end = MAX-1; MergeSort(range); PrintArray(Data, MAX); cout << "Application terminated" << endl; } DWORD WINAPI WorkerThreadFunc (LPVOID lpThreadParam) { DWORD dwThreadID = GetCurrentThreadId(); cout << "Thread " << dwThreadID << " alive and owns " << Data[(int) lpThreadParam] << endl; Sleep(WAIT_TIME); return dwThreadID; }