Namespaces
Variants
Actions

Implementing recursive mutexes

Jump to: navigation, search
Article Metadata

Article
Created: eswar_illuri (30 May 2007)
Last edited: hamishwillee (26 Jul 2012)

If you come from a POSIX environment, you'll find Symbian's support for synchronization primitives rather simplistic. This is in some way due to Symbian's preference for single threaded applications using the Active object idiom, thus making the use of multithreading often unnecessary. Sometimes, the need for recursive (reentrant) mutexes arises (note though that POSIX mutexes aren't recursive by default). Here is a possible implementation of a wrapper class over a RMutex:

class TRecursiveMutex
{
public:
TRecursiveMutex();
~TRecursiveMutex();
 
void Acquire();
void Release();
 
private:
RMutex iMutex;
TThreadId iOwner;
TInt iCount;
};
 
TRecursiveMutex::TRecursiveMutex() : iCount(0)
{
iMutex.CreateLocal();
}
 
TRecursiveMutex::~TRecursiveMutex()
{
iMutex.Close();
}
 
void TRecursiveMutex::Acquire()
{
TThreadId id = RThread().Id();
if (iOwner == id)
{
++iCount;
}
else
{
iMutex.Wait();
iCount = 1;
iOwner = id;
}
}
 
void TRecursiveMutex::Release()
{
if (--iCount == 0)
{
iOwner = 0;
iMutex.Signal();
}
}

Note:You'll notice this is a bare bones implementation. Potential things to be added (at least on debug builds) could be checking thread ownership and iCount being 0 upon destruction

This page was last modified on 26 July 2012, at 01:52.
94 page views in the last 30 days.
Nokia Developer aims to help you create apps and publish them so you can connect with users around the world.

京ICP备05048969号  © Copyright Nokia 2013 All rights reserved