summaryrefslogtreecommitdiffstats
path: root/04_exercise/quicksort.c
diff options
context:
space:
mode:
Diffstat (limited to '04_exercise/quicksort.c')
-rw-r--r--04_exercise/quicksort.c26
1 files changed, 21 insertions, 5 deletions
diff --git a/04_exercise/quicksort.c b/04_exercise/quicksort.c
index ade513b..7398282 100644
--- a/04_exercise/quicksort.c
+++ b/04_exercise/quicksort.c
@@ -4,17 +4,33 @@
#include <stdlib.h>
#include <time.h>
#include <string.h>
+#include <pthread.h>
static size_t partition(int v[], size_t len);
/* TODO: quicksort-Implementation parallelisieren */
-static void quicksort(int list[], size_t len) {
- if (len <= 1) return;
+typedef struct quicksort_param {
+ int *list;
+ size_t len;
+} quicksort_param;
+
+TASK(int, quicksort, quicksort_param)
+
+int quicksort(quicksort_param param) {
+ int *list = param.list;
+ size_t len = param.len;
+ fprintf(stderr, "Thread %ld: quicksort being called with list %p and len %ld \n", pthread_self(), (void *) list, len);
+ if (len <= 1) return 0;
size_t mid = partition(list, len);
- quicksort(list, mid);
- quicksort(list + mid + 1, len - mid - 1);
+ quicksort_fut fut1_t = quicksortFuture((quicksort_param){list, mid});
+ quicksort_fut fut2_t = quicksortFuture((quicksort_param){list + mid + 1, len - mid - 1});
+ quicksort_fut *fut1 = quicksortAsync(& fut1_t);
+ quicksort_fut *fut2 = quicksortAsync(& fut2_t);
+ quicksortAwait(fut1);
+ quicksortAwait(fut2);
+ return 0;
}
size_t partition(int v[], size_t len) {
@@ -108,7 +124,7 @@ int main(int argc, const char *argv[]) {
/* sort it and print the sorted list if it's not too long */
struct timespec start, end, dt;
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &start);
- quicksort(list, list_len);
+ quicksort((quicksort_param){list, list_len});
clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &end);
dt = time_diff(start, end);
printf("---- Sortiert: %i ----\n", list_is_sorted(list, list_len));