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. |