Re: problem with CMtex and CSingle lock - WAIT_ABANDONED
Dh wrote:
Hi,
We have a windows service that runs several threads.
Each thread does lot of database operations and lot of files are stored
to the filesystem.
[snip code]
We are currently facing the following problem -
The OperationClass are synhronised using a named Mutex(say, M1) object.
There is also another helper class that uses another named Mutex (say,
M2).
The OperationClass class calls the helper class APIs in its methods.
In general, make sure you always lock mutexes in the same order - ensure
you have a "lock hierarchy". The code you posted is fine in this
respect, but you may use the locks elsewhere.
In some circumstances(where several threads were spawned) we
encountered a problem in that M2 would held by one thread while M1
would be held by another, resulting in a deadlock.
For investigation purpouses, we derived from CSinglelock, added some
additional logging statements for the ctor, dtor and the Lock and
Unlock methods.
The result was :
When several threads are executing parallely,
we occasionally the CSingle lock in HelperClass::function2 is getting a
value WAIT_ABANDONED. But strangely in our case, the thread which owned
the mutex M2 previously is NOT terminated, but is still alive and is
processing and had released the lock on the mutex M2 properly.
Now the question is, how can the Mutex get abandoned?
When a thread holding the mutex (which, given that the mutex is a named
mutex, could be part of any process) terminates without first releasing
the mutex.
The application is built using VC6.
We are using the standard MFC classes (CMutex) and CSingleLock for
synchronisation.
Any information on the above info would be helpful.
Check for WAIT_ABANDONED after you lock each time, and if it happens,
try to lock again. Also, make sure your mutex names are unique to your
service, for obvious reasons - conceivably it could be a usage of your
named mutex from somewhere else that is the problem.
Tom