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