Hello,

This is an announcement about our *synchronized* macro available in
*<stout/synchronized.hpp>*. *synchronized* is essentially a syntactic sugar
to the *std::lock_guard* pattern that is reminiscent of Java's
*synchronized*.

With *std::lock_guard*:

*  std::mutex m;*
*  {*
*    std::lock_guard<std::mutex> lock(m);  **// Acquire.*
*    // Do something under the lock.*
*  }  **// Release.*

With *synchronized*:

*  std::mutex m;*
*  synchronized (m) {**  // Acquire.*
*    // Do something under the lock.*
*  }**  // Release.*

*synchronized* is currently supported for

   - Any *T* that has *T::lock()* and *T::unlock()* (practically these
   include *std::mutex, std::recursive_mutex*, etc)
   - *std::atomic_flag* (remember to initialize it to *ATOMIC_FLAG_INIT*)
   - *pthread_mutex_t* (we'll be deprecating this as soon as possible)

If you find that you need additional support for your lock type *T*, you
can add it easily by adding a *synchronize* function. It should follow this
pattern:

*  Synchronized<T> synchronize(T* t)*
*  {*
*    return Synchronized<T>(*
*        t,*
*        [](T *t) { /* lock 't'. */ },*
*        [](T *t) { /* unlock 't'. */ });*
*  }*

Great example of this is available in
*3rdparty/libprocess/src/libevent_ssl_socket.hpp
*for customized locking of *libevent*'s *bufferevent*.

*  Synchronized<bufferevent> synchronize(bufferevent* bev)*
*  {*
*    return Synchronized<bufferevent>(*
*        bev,*
 *       [](bufferevent* bev) { bufferevent_lock(bev); },*
*        [](bufferevent* bev) { bufferevent_unlock(bev); });*
*  }*

We use this mechanism consistently throughout the codebase, and would like
it to be the standard pattern for locking critical sections.

Thanks,

MPark.

Reply via email to