FREE Subscription to Dr. Dobb’s Digest: Same Great Content, New Digital Edition
Site Archive (Complete)
Architecture & Design
Email
Print
Reprint

add to:
Del.icio.us
Digg
Google
Furl
Slashdot
Y! MyWeb
Blink
TABLE OF CONTENTS
  • Home
  • Source Code Listings
June 11, 2009

Locks and Holds: The Basics of Synchronization

(Page 2 of 2)
Listing One

class Lock; // this is the basic lock

class AutoLock { public: AutoLock(Lock &arg) : lock_(arg) { lock_.lock(); }

~AutoLock() { lock_.unlock(); } protected: Lock &lock_; };

// ... used like this ... { AutoLock al(myLock); call(); }

Listing Two

class AutoUnlock { public: AutoUnlock(Lock &arg) : lock_(arg) { lock_.unlock(); }

~AutoUnlock() { lock_.lock(); } protected: Lock &lock_; }; // ... used like this ... { AutoLock al(myLock); for(...) { SomeClass variable; ... { AutoUnlock au(myLock); long_operation(); } ... } }

Listing Three

class Hold { public: Hold() : count_(0), waiting_(0) { pthread_mutex_init(&mutex_, NULL); pthread_cond_init(&cond_, NULL); } ~Hold() { pthread_mutex_destroy(&mutex_); pthread_cond_destroy(&cond_); }

void getHold() { pthread_mutex_lock(&mutex_); ++count_; pthread_mutex_unlock(&mutex_); }

void releaseHold() { pthread_mutex_lock(&mutex_); if (--count_ == 0 && waiting_ != 0) pthread_cond_broadcast(&cond_); pthread_mutex_unlock(&mutex_); }

void wait() { pthread_mutex_lock(&mutex_); while(count_ != 0) { ++waiting_; pthread_cond_wait(&cond_, &mutex_); --waiting_; } pthread_mutex_unlock(&mutex_); }

protected: pthread_mutex_t mutex_; // access to count_ pthread_cond_t cond_; // signalled when count_ drops to 0 int count_; // count of holds int waiting_; // count of threads waiting for release

private: // prevent the copy constructors and assignments Hold(const Hold&); void operator=(const Hold&); };

Previous Page | 1 | 2 Source Code Listings
TOP 5 ARTICLES
No Top Articles.



MICROSITES
FEATURED TOPIC

ADDITIONAL TOPICS

INFO-LINK