正确实现简单线程安全通用互斥的方法

时间:2012-07-05 19:46:36

标签: c++ multithreading pthreads mutex

我想知道我实现通用互斥锁的方式是不是一个好的软件设计模式,它是否是线程安全的?

这是我的互斥类:

#ifdef HAVE_WINDOWS_H
void *CSimpleMutex::object;
#endif
#ifdef _PTHREADS
pthread_mutex_t CSimpleMutex::object;
#endif

CSimpleMutex::CSimpleMutex(bool lockable)
{
    isLockableMutex = lockable;
    if (!lockable)
    {
#ifdef _WINDOWS
        object = CreateMutex(NULL, false, NULL);
#endif
#ifdef _PTHREADS
        pthread_mutex_init(&object, NULL);
#endif
    }
    else
    {
#ifdef _WINDOWS
        InitializeCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
        pthread_mutex_init(&mutex, NULL);
#endif
    }
}

CSimpleMutex::~CSimpleMutex()
{
    if (!isLockableMutex)
    {
#ifdef _WINDOWS
        if(object!=NULL)
        {
            CloseHandle(object);
        }
#endif
#ifdef _PTHREADS
        pthread_mutex_destroy(&object);
#endif
    }
    else
    {
#ifdef _WINDOWS
        DeleteCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
        pthread_mutex_destroy(&mutex);
#endif  
    }
}

// Aquires a lock
void CSimpleMutex::Lock()
{
    if (!isLockableMutex)
        return;
#ifdef _WINDOWS
    EnterCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
    pthread_mutex_lock(&mutex);
#endif
}

// Releases a lock
void CSimpleMutex::Unlock()
{
    if (!isLockableMutex)
        return;
#ifdef _WINDOWS
    LeaveCriticalSection(&mutex);
#endif
#ifdef _PTHREADS
    pthread_mutex_unlock(&mutex);
#endif
}

这是如何使用的:

class CEnvironment : public CHandleBase
{
    private:
        CSimpleMutex *mutex;
    public:
        CEnvironment(){mutex = new CSimpleMutex(true);};
        ~CEnvironment(){delete mutex;};
        void Lock() { mutex->Lock(); };
        void Unlock() { mutex->Unlock(); };
        void DoStuff(void *data);
};

当我想使用CEnvironment时,我会这样做:

env->Lock();
env->DoStuff(inData);
env->Unlock();

1 个答案:

答案 0 :(得分:1)

您通常使用RAII分别获取和释放锁定进入和离开给定范围,以便在该范围内抛出异常时自动释放锁定。在您的情况下,您可以定义一个加法锁“guard”类,它在其构造函数中获取锁,并在其析构函数中释放。例如,C ++ 11标准定义了几个mutex类和一个std::lock_guard类,它们提供了我刚才描述的行为。

Strategized Locking, Thread-safe Interface, and Scoped Locking的论文“Doug Schmidt”提供了可能有用的其他设计细节和想法。