
qsort(a[], l, r)
if r - l > 1
m = partition(a, l, r)
qsort(a, l, m)
qsort(a, m, r)
qsort(a, 0, a.length)
static void * qsorter(void * qsp)
if (qsp->right - qsp->left <= 16)
selection_sort(qsp->a, qsp->left, qsp->right)
else
mid = partition(qsp->a, qsp->left, qsp->right)
tid1 = make_qsorter(qsp->a, qsp->left, mid)
tid2 = make_qsorter(qsp->a, mid, qsp->right)
check_error(pthread_join(tid1, NULL))
check_error(pthread_join(tid2, NULL))
pthread_exit(0)

|
|
|
t_create(qsort, left, mid) t_create(qsort, mid, right)
int main()
if (pid = fork()) ≡ 0
qsorter(array, 0, n)
else
waitpid(pid, NULL, 0)
check_sorted_array(array, 0, n)

void qsorter(array[], left, right)
if (right - left ≤ 16)
selection_sort(array, left, right)
else
mid = partition(array, left, right)
if (pid-l = fork()) ≡ 0
qsorter(array, left, mid)
if (pid-r = fork()) ≡ 0
qsorter(array, mid, right)
waitpid(pid-l, NULL, 0)
waitpid(pid-r, NULL, 0)
exit(EXIT_SUCCESS)

|
|
fork() semantics easily communicates resource down the process tree.
|
shm_open() — create or access shared memory.
mmap() — map shared memory into a process
address space.
close() — unmap shared memory.
shm_unlink() — delete shared memory.



array[left..right).

struct { int left, right }

| This page last modified on 2014 September 16. |