#define NUM 100 I64 mp_not_done_flags, grand_total; U0 MPRoutine(CDoc *doc) { I64 i, sum = 0, lo = NUM * Gs->num / mp_count, //This is how to divide a job hi = NUM * (Gs->num + 1) / mp_count; for (i = lo; i < hi; i++) sum += i; DocPrint(doc, "Core#%d:%d-%d:%d\n", Gs->num, lo, hi - 1, sum); lock {grand_total += sum;} LBtr(&mp_not_done_flags, Gs->num); } U0 Main() { I64 i; grand_total = 0; mp_not_done_flags = 1 << mp_count - 1; for (i = 0; i < mp_count; i++) Spawn(&MPRoutine, DocPut, NULL, i); while (mp_not_done_flags) Yield; "Grand total:%d\n", grand_total; } Main;