2015-07-17 4 views
0

C++ pseudocode class:Является ли блокировка разыменованных мьютексов плохим поведением?

Простой класс, который имеет переменную-член и мьютекс для контроля доступа к нему.

Мне любопытно, что у профессионалов и разработчиков управление данными и их доступ. В многопоточном окружении неверно использовать подход к доступу и блокировке мьютекса элемента в cbMethodA()?

Я видел образцы, к которым непосредственно обращаются к членам, и это кажется неправильным. Класс предоставляет доступ через открытый метод по какой-либо причине. Кроме того, разыменование мьютекса для его блокировки не похоже на лучшую практику. Любые комментарии? Благодаря

class A 
    { 
    public: 
     A():val(0); 
     ~A(); 
     int getVal(void); 
     static void cbMethodA(); 
     static void cbMethodB(); 

    private: 
     Mutex m_mutex; 
     int val; 
    } 

    int A::getVal(){ 
    { 
     int returnVal = 0; 
     lockMutex(m_mutex); 
     returnVal = m_val; 
     unlock(mutex); 
     return returnVal; 
    } 

void A::cbMethodA(void *ptr) 
{ 
    A* ptr = static_cast<A*> (ptr); 
    //get val 
    lockMutex(ptr->m_mutex); 
    //read val 
    int tempVal = ptr->m_val; 
    unlockMutex(ptr->m_mutex); 
    //do something with data 
} 

void A::cbMethodB(void *ptr) 
{ 
    A* ptr = static_cast<A*> (ptr); 
    //get val 
    int tempVal = ptr->getVal(); 
    //process val.... 
} 
+0

Какую реализацию мьютекса вы планируете использовать? Ответ на этот вопрос позволил бы дать более окончательный ответ. Мьютекс используется для защиты критического раздела кода, который может включать доступ к совместно используемому ресурсу или к некоторым общим переменным. –

+0

Спасибо Тим. Я ничего не внедряю, просто читаю код в Интернете, и мне было любопытно, когда я видел, как попали прямые члены, поскольку я всегда писал код для использования get/set. Я не был уверен, что мне не хватает какой-то причуды из-за статического метода или нет. – ianhobo

ответ

2

Это похоже на непосредственное применение SPOT (S Ingle Р oint О F T Ruth), также известный как сухой (D on't R EPEAT Y ourself), два имени для single important idea. Вы создали функцию для доступа к val, которая выполняет некоторые задачи, которые всегда должны сочетаться с доступом к ней. Если для доступа к полю элемента напрямую не существует частной, специфичной для реализации, вам, вероятно, следует использовать метод getter, который вы определяете. Таким образом, если вы измените механизм синхронизации, который защищает val, вам нужно обновить только один фрагмент кода.

Я не могу думать о какой-либо причине, почему «разыменования семафор, чтобы заблокировать его» будет плохо вещь, повторяя себя это плохо.

+1

Спасибо, Бренн. Это был код в проекте, который я читал в Интернете. Я не был уверен, не понял ли я что-то о статическом члене (или что-то еще), поэтому я спрашиваю здесь :) (Этот комментарий - прекрасный пример WET, который я думаю);) – ianhobo

+0

... ** W ** rite ** E ** все что угодно ** T ** wice? – brenns10

+0

Да, мое объяснение и вам, и Тиму было таким же. Плохая шутка, я думаю :) – ianhobo

Смежные вопросы