
Hi,
comments below
On 5/12/06, Patel Priyank-PPATEL1
Hi Joaquin,
I have to use actually two or more threads on procedure pool. I start seeing same Problem when I have three/four threads working on same procedure pool. I tried to introduce mutex (ACE_Guard) but still having problems in execution in one/two minute of execution. Seems I am guarding every method that is used by container. Anything wrong with the Following code?
int Procedure_Pool::add_by_id(Procedure * _procedure) { LD_TRACE("Procedure_Pool::add_by_id"); ACE_ASSERT(_procedure != 0); ACE_DEBUG((LM_DEBUG, "ADDING %d\n", _procedure->id()));
if (find_by_id(_procedure->id()) == 0) { ACE_Guard
guard(mutex_); { // procedure not found procedure_by_id_.insert(_procedure); } // debug info ACE_DEBUG((LM_DEBUG, "Added procedure : %d \n", _procedure->id())); // return success return 0; } else { // error ACE_ERROR((LD_ERROR "%N:%l Error in adding procedure : %d \n", _procedure->id())); // return failure return -1; } }
int Procedure_Pool::remove_by_id(Procedure * _procedure) { LD_TRACE("Procedure_Pool::remove_by_id"); ACE_ASSERT(_procedure != 0); ACE_DEBUG((LM_DEBUG, "REMOVING: %d \n", _procedure->id())); if (find_by_id(_procedure->id()) != 0) { ACE_Guard
guard(mutex_); { // procedure found procedure_by_id_.erase(_procedure->id()); } ACE_DEBUG((LM_DEBUG, "Removed procedure : %d \n", _procedure->id())); return 0; } else { ACE_ERROR((LD_ERROR "%N:%l Error in removing procedure : %d \n", _procedure->id())); return -1; } }
Procedure * Procedure_Pool::find_by_id(int _id) { LD_TRACE("Procedure_Pool::find_by_id"); ACE_Guard
guard(mutex_); { Procedure_By_Id::iterator it = procedure_by_id_.find(_id); if (it != procedure_by_id_.end()) { ACE_DEBUG((LM_DEBUG, "%N:%l Found procedure for id: %d \n", _id)); return *it; } } ACE_DEBUG((LM_DEBUG, "%N:%l Not able to found procedure for id: %d \n", _id)); // return null return 0; }
Yes. There is a small theoretical problem with your code. A possible race condition. you tried to find_by_id, using mutex, than release that mutex and reacquire it for erase. That's a possible race condition. The "find" until the "erase" must be atomic. At least IMHO. Kobi.