Processor self-scheduling is a useful scheme in a multiprocessor system if the execution time of each iteration in a parallel loop is not known in advance and varies substantially, or if there are multiple nestings in parallel loops which makes static scheduling difficult and inefficient. By using efficient synchronization primitives, the operating system is not needed for loop scheduling. The overhead for the processor self-scheduling is small. A self-scheduling scheme is presented for a single-nested parallel loop and is extended to multiple-nested parallel loops. Barrier synchronization mechanisms for the self-scheduling schemes are also discussed.