Ориентированный на многопотоковое исполнение добираются (метод доступа)

Я в настоящее время использую следующий код для ориентированного на многопотоковое исполнение доступа переменной.

int gnVariable;

void getVariableValue(int *pnValue)
{
    acquireLock(); //Acquires the protection mechanism
    *pnValue = gnVariable;
    releaseLock(); //Releasing the protection mechanism
}

Я хотел бы изменить свою подпись API на более удобное для пользователя

int getVariableValue(void);

Как я должен переписать функцию - таким образом, что пользователи API не должны беспокоиться о деталях блокировки/разблокирования?

5
задан sonofdelphi 17 May 2010 в 05:41
поделиться

2 ответа

Поскольку вы предоставили C ++ в качестве опции, вы можете обернуть блокировку / разблокировку мьютекса. Затем вы можете напрямую вернуть значение:

class lock_wrapper
{
public:
    lock_wrapper()
    {
        acquireLock();
    }
    ~lock_wrapper()
    {
        releaseLock();
    }
};

int getVariableValue()
{
    lock_wrapper lw;
    return gnVariable;
}

Это также пригодится, если вам когда-нибудь понадобится выполнить блокировку / разблокировку кода, который может вызвать исключение.

9
ответ дан 18 December 2019 в 09:48
поделиться

Вы возвращаете копию локальной переменной. Что-то вроде:

int getVariableValue(void)
{
  int local= 0;
  acquireLock();
  local = gnVariable;
  releaseLock();
  return local;
}

В качестве примечания, лучше использовать принцип RAII для блокировки вместо методов acquLock и releaseLock .

8
ответ дан 18 December 2019 в 09:48
поделиться