| 
 
 | 
 | 
queue.put(w):
  if size < n
    size++
    b[tail] = w
    tail = (tail + 1) mod n
queue.get():
  if size > 0
    size--
    w = b[head]
    head = (head + 1) mod n
  return w
size = 0).
  
consumer producer buffer.put(w)if size < nsize++context switch w = buffer.get()if size > 0size--w = b[head]
size < n - 2 with two producers.
producer1 producer2 buffer.put(w)if size < nsize++b[tail] = wcontext switch buffer.put(w)if size < nsize++b[tail] = w
put() and get() calls.
    queue.put(w): if size < n size++ b[tail] = w tail = (tail + 1) mod n queue.get(): if size > 0 size-- w = b[head] head = (head + 1) mod n return w
queue.put(w): disableinterrupts() if size < n size++ b[tail] = w tail = (tail + 1) mod n ensableinterrupts() queue.get(): disableinterrupts() if size > 0 size-- w = b[head] head = (head + 1) mod n ensableinterrupts() return w

mutex.lock() - get the key, lock the mutex.  Block if the key’s
    not available. 
    mutex.unlock() - Unlock the mutex, return the key.  Wake up a
    thread blocked during a lock.
    
unlock(). 
    
mutex buffermutex  // unlocked to start
queue buffer        // empty to start
producer:
  while true
    widget w = makeWidget()
    buffermutex.lock()
    buffer.put(w);
    buffermutex.unlock()
consumer:
  while true
    buffermutex.lock()
    widget w = buffer.get()
    buffermutex.unlock()
    munge(w)
pthread_mutex_t m int pthread_mutex_lock( pthread_mutex_t *mutex) int pthread_mutex_trylock( pthread_mutex_t *mutex) int pthread_mutex_unlock( pthread_mutex_t *mutex)
trylock() doesn’t block, but 
returns false
  when it tries to lock a locked mutex.
  class ProtectedQueue
  
  private Queue q;
  
  synchronous put(e)
    q.put(e)
  
  synchronous get()
    return q.get()
ProtectedQueue pbuffer
  
producer()
  while true
    pbuffer.put(makeWidget())
  
consumer()
  while true
    munge(pbuffer.get())
class mutex
  private bool locked
  void lock()
    if locked
      wait until unlocked
    lock = true
  void unlock
    lock = false
    if waiting threads
      wake one up
m is unlocked.
thread1 thread2 m.lock()if lockedcontext switch m.lock()if lockedlocked = truecontext switch locked = true
void lock() disableinterrupts() if locked wait until unlocked lock = true enableinterrupts() void unlock() disableinterrupts() lock = false if waiting threads wake one up enableinterrupts()
void lock() disableinterrupts() if locked wait until unlocked lock = true enableinterrupts()
void lock() disableinterrupts() if locked enableinterrupts() wait until unlocked disableinterrupts() lock = true enableinterrupts() void unlock() disableinterrupts() lock = false if waiting threads wake one up enableinterrupts()
m.
thread1 thread2 thread3 m.lock()disable interrupts()if lockedenable interrupts()waitcontext switch m.unlock()context switch m.locked()context switch disable interrupts()lock = trueenable interrupts()
|  |  | 
|  | 
 | 
| This page last modified on 2012 February 13. |