
Yasmina Berber wrote:
Hi, everybody I have a problem to understand mutex behaviour in a server client program . basically there are two threads that execute different code in two different classes but manipulate the same resource: fisrt Class is Subscriber with these members :
public: ACE_Unbounded_Set
m_set; typedef boost::recursive_mutex Mutex; typedef boost::recursive_mutex::scoped_lock Lock; Mutex mutex_set; and methods: Subscribe (client_reference) : inserts (add) a reference client to the set { ... Lock theScope( mutex_set); m_set.insert (client_reference) ... } Unsubscribe(client_reference) : removes a reference client from the set { ... Lock theScope( mutex_set); m_set.remove (client_reference) }
the second class is Manager that has a shared pointer to Subscriber (SubscriberPtr) and does a specific opeartion on each client_reference inside a for loop in the method Manage() { boost::recursive_mutex::scoped_lock scoped_lock(subscriberPtr->mutex_set) for (Subscriber::Set_Iterator iter (subscriberPtr->m_set); iter.next (...) != 0 ; iter.advance ()) { specific opeartion on each client reference } } What happens is that a client can be removed (call to Unsubscribe()) by the first thread during the second one is executing manage() : the set is not well protected and this causes of course seg fault.
I probably do something wrong, If you need more details please let me know. Regards.
Hi Could any one help me in this forum? Thank you