Является ли этот код рабочим классом оболочки критического раздела - PullRequest
1 голос
/ 06 октября 2011

На самом деле у меня есть 2 вопроса, вот первый.

Используя код, который я нашел на двух разных сайтах, я написал эти два критических класса-обертки раздела.

Идет ли это?на работу?

#ifndef CRITICALSECTION_H
#define CRITICALSECTION_H
#include "windows.h"



class CriticalSection{
    long m_nLockCount;
    long m_nThreadId;
    typedef CRITICAL_SECTION cs;
    cs m_tCS;
public:
    CriticalSection(){
        ::InitializeCriticalSection(&m_tCS);
        m_nLockCount = 0;
        m_nThreadId = 0;
    }
    ~CriticalSection(){ ::DeleteCriticalSection(&m_tCS); }
    void Enter(){ ::EnterCriticalSection(&m_tCS);  }
    void Leave(){  ::LeaveCriticalSection(&m_tCS); }
    void Try();
};


class LockSection{
    CriticalSection* m_pCS;
public:
    LockSection(CriticalSection* pCS){
        m_pCS = pCS;
        if(m_pCS)m_pCS->Enter();
    }
    ~LockSection(){
        if(m_pCS)m_pCS->Leave();
    }
}

/*

Safe class basic structure;

class SafeObj
{
     CriticalSection m_cs;

public:
    void SafeMethod()
    {
        LockSection myLock(&m_cs);
        //add code to implement the method ...

    }
};



*/
#endif

И второй вопрос.Просматривая здесь , я заметил, что автор не включил

:: Initialize, Delete, Enter, Leave критических разделов.Разве это не нужно для того, чтобы класс работал правильно?Или я что-то упустил?

Ответы [ 2 ]

2 голосов
/ 06 октября 2011

Я отвечу на первый вопрос. Второй вопрос касается кода на другом сайте, и вы должны задавать только один вопрос за раз. Возможно, кто-то еще ответит на второй вопрос.

Код, который вы включили, будет работать правильно. Члены m_nLockCount и m_nThreadId не используются и не нужны. Метод Try() не имеет реализации, но вы можете просто удалить его

Лично я бы поднял исключение, если m_pCS не назначен. Это явная ошибка. Молча продолжать и притворяться, что ресурс защищен, является очевидной опасностью.

2 голосов
/ 06 октября 2011

Класс LockSection использует RAII для вызова Enter и Leave.Когда объект создан, вызывается Enter.Когда объект уничтожается (выходя из области видимости), вызывается Leave.

Initialize и Delete вызываются конструктором и деструктором CriticalSection class '.

Изучите RAII, изучите это хорошо.Это твой друг.

...