On 02/21/2015 04:44 PM, Doron Somech wrote:

> (https://github.com/zeromq/libzmq/blob/master/src/mailbox_safe.hpp) have

I had a quick look at this class...

The workaround in the destructor is not thread-safe. Another thread
may enter and wait between the sync->unlock() and the end of the
destructor scope. You need to add a state variable to prevent this
from happening.

Furthermore, if another thread is waiting on the condition variable,
then the mutex is unlocked while it is waiting. You need to
notify (broadcast) the condition variable to wake up the other thread
and get it out of the class. You will most likely need to to add a
reference count to keep track of how many pending threads are waiting
in order to know when it is safe to exit the destructor.

The use of sync->lock() and sync->unlock() is not exception safe. I
suggest that you use a scoped lock instead of the explicit calls. Read
this for inspiration:

   http://en.cppreference.com/w/cpp/thread/unique_lock

The code does not handle spurious wakeups from the condition variable.

_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
http://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to