0

汎用ミューテックスを実装する私の方法が優れたソフトウェアデザインパターンであるかどうか疑問に思っています。それはスレッドセーフですか?

これが私のミューテックスクラスです:

#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();
4

1 に答える 1

1

通常、RAIIを使用して、特定のスコープに出入りするときにそれぞれロックを取得および解放します。これにより、そのスコープ内で例外がスローされた場合にロックが自動的に解放されます。あなたの場合、コンストラクタでロックを取得し、デストラクタで解放する追加のロック「ガード」クラスを定義できます。たとえば、C ++ 11標準では、いくつかのミューテックスクラスと、std::lock_guard今説明した動作を提供するクラスが定義されています。

DougSchmidtによる論文「 StrategizedLocking、Thread-safe Interface、and Scoped Locking」は、役立つ可能性のある追加の設計の詳細とアイデアを提供します。

于 2012-07-05T20:24:30.360 に答える