On 5/12/06, Patel
Priyank-PPATEL1 <priyankpatel@motorola.com>
wrote:
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<ACE_Mutex>
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<ACE_Mutex>
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<ACE_Mutex>
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.