Я в настоящее время использую следующий код для ориентированного на многопотоковое исполнение доступа переменной.
int gnVariable;
void getVariableValue(int *pnValue)
{
acquireLock(); //Acquires the protection mechanism
*pnValue = gnVariable;
releaseLock(); //Releasing the protection mechanism
}
Я хотел бы изменить свою подпись API на более удобное для пользователя
int getVariableValue(void);
Как я должен переписать функцию - таким образом, что пользователи API не должны беспокоиться о деталях блокировки/разблокирования?
Поскольку вы предоставили C ++ в качестве опции, вы можете обернуть блокировку / разблокировку мьютекса. Затем вы можете напрямую вернуть значение:
class lock_wrapper
{
public:
lock_wrapper()
{
acquireLock();
}
~lock_wrapper()
{
releaseLock();
}
};
int getVariableValue()
{
lock_wrapper lw;
return gnVariable;
}
Это также пригодится, если вам когда-нибудь понадобится выполнить блокировку / разблокировку кода, который может вызвать исключение.
Вы возвращаете копию локальной переменной. Что-то вроде:
int getVariableValue(void)
{
int local= 0;
acquireLock();
local = gnVariable;
releaseLock();
return local;
}
В качестве примечания, лучше использовать принцип RAII для блокировки вместо методов acquLock
и releaseLock
.