Uniprocessor Lock Implementation class Lock Lock int locked

  • Slides: 6
Download presentation
Uniprocessor Lock Implementation class Lock { Lock() {} int locked = 0; Thread. Queue

Uniprocessor Lock Implementation class Lock { Lock() {} int locked = 0; Thread. Queue q; }; void Lock: : lock() { intr. Disable(); if (!locked) { locked = 1; } else { q. add(current. Thread); block. Thread(); } intr. Enable(); } void Lock: : unlock() { intr. Disable(); if (q. empty() { locked = 0; } else { unblock. Thread(q. remove()); } intr. Enable(); } CS 111 Lecture Notes: Lock Implementation Slide 1

Locks for Multi-Core, v 1 class Lock { Lock() {} std: : atomic<int> locked(0);

Locks for Multi-Core, v 1 class Lock { Lock() {} std: : atomic<int> locked(0); }; void Lock: : unlock() { locked = 0; } void Lock: : lock() { while (locked. exchange(1)) { /* Do nothing */ } } CS 111 Lecture Notes: Lock Implementation Slide 2

Locks for Multi-Core, v 2 class Lock { Lock() {} std: : atomic<int> locked(0);

Locks for Multi-Core, v 2 class Lock { Lock() {} std: : atomic<int> locked(0); Thread. Queue q; }; void Lock: : lock() { if (locked. exchange(1)) { q. add(current. Thread); block. Thread(); } } void Lock: : unlock() { if (q. empty() { locked = 0; } else { unblock. Thread( q. remove()); } } CS 111 Lecture Notes: Lock Implementation Slide 3

Locks for Multi-Core, v 3 class Lock { Lock() {} int locked = 0;

Locks for Multi-Core, v 3 class Lock { Lock() {} int locked = 0; Thread. Queue q; std: : atomic<int> spinlock; }; void Lock: : lock() { while (spinlock. exchange(1)) { /* Do nothing */ } if (!locked) { locked = 1; spinlock = 0; } else { q. add(current. Thread); spinlock = 0; block. Thread(); } } void Lock: : unlock() { while (spinlock. exchange(1)) { /* Do nothing */ } if (q. empty() { locked = 0; } else { unblock. Thread(q. remove()); } spinlock = 0; } CS 111 Lecture Notes: Lock Implementation Slide 4

Locks for Multi-Core, v 4 class Lock { Lock() {} int locked = 0;

Locks for Multi-Core, v 4 class Lock { Lock() {} int locked = 0; Thread. Queue q; std: : atomic<int> spinlock; }; void Lock: : lock() { while (spinlock. exchange(1)) { /* Do nothing */ } if (!locked) { locked = 1; spinlock = 0; } else { q. add(current. Thread); current. Thread->state = BLOCKED; spinlock = 0; reschedule(); } } void Lock: : unlock() { while (spinlock. exchange(1)) { /* Do nothing */ } if (q. empty() { locked = 0; } else { unblock. Thread(q. remove()); } spinlock = 0; } CS 111 Lecture Notes: Lock Implementation Slide 5

Locks for Multi-Core, v 5 class Lock { Lock() {} int locked = 0;

Locks for Multi-Core, v 5 class Lock { Lock() {} int locked = 0; Thread. Queue q; std: : atomic<int> spinlock; }; void Lock: : lock() { intr. Disable(); while (spinlock. exchange(1)) { /* Do nothing */ } if (!locked) { locked = 1; spinlock = 0; } else { q. add(current. Thread); current. Thread->state = BLOCKED; spinlock = 0; reschedule(); } intr. Enable(); } void Lock: : unlock() { intr. Disable(); while (spinlock. exchange(1)) { /* Do nothing */ } if (q. empty() { locked = 0; } else { unblock. Thread(q. remove()); } spinlock = 0; intr. Enable(); } CS 111 Lecture Notes: Lock Implementation Slide 6