Boost logo

Boost Users :

From: Craig Rodrigues (rodrigc_at_[hidden])
Date: 2004-02-17 16:46:36


On Mon, Feb 16, 2004 at 08:33:47PM -0500, Michael Glassford wrote:
> The original designer of the Boost.Thread library and others felt that
> semaphores were too easily misused, leading to errors (see
> http://boost.org/libs/thread/doc/rationale.html#events). Others have
> argued the issue on the various Boost mailing lists at some length
> more than once; some have been convinced that the "too easily misused"
> argument has merit, others have not.

OK, well I don't do much Windows programming, so I don't
really understand what event variables are. I'll have to do
my homework and read up on them.

In terms of explaining what a semaphore is,
my frame of reference is the stuff in POSIX:

http://www.opengroup.org/onlinepubs/007904975/functions/sem_post.html
http://www.opengroup.org/onlinepubs/007904975/functions/sem_wait.html
http://www.opengroup.org/onlinepubs/007904975/functions/sem_trywait.html
http://www.opengroup.org/onlinepubs/007904975/functions/sem_timedwait.html

Basically, a semaphore is initialized with a count.
When you call sem_post(), the semaphore count is incremented.
When you call sem_wait(), if the semaphore count is 0, then the
thread blocks, else the semaphore count is decremented.

It is possible to implement semaphore's with mutexes and
condition variables. I looked at the source code for
FreeBSD 5.2's implementation of semaphores to see how this was
done:

http://www.freebsd.org/cgi/cvsweb.cgi/~checkout~/src/lib/libpthread/thread/thr_sem.c

I even took a whack at writing one based on Boost (it may be buggy):

#include <boost/thread.hpp>
#include <boost/thread/mutex.hpp>

struct mysem {
   mysem(unsigned int count): count_(count) {}

   void post() {
      boost::mutex::scoped_lock l(sem_mutex_);
      ++count_;
      sem_cond_.notify_all();
   }

   void wait() {
      boost::mutex::scoped_lock l(sem_mutex_);
      for(;;) {

       if( count_ == 0 ) sem_cond_.wait(l);
       else { --count_; break; }
      }
   }

  private:
   unsigned int count_;
   boost::mutex sem_mutex_;
   boost::condition sem_cond_;
};

What kinds of things can go wrong if I use this class?

> As far as adding a barrier class, however: one has existed in the
> thread_dev branch in CVS for quite some time; I hope to move it to the
> main branch very soon.

Cool, thanks!

-- 
Craig Rodrigues        
http://crodrigues.org
rodrigc_at_[hidden]

Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net