我目前正在使用以下代码进行变量的线程安全访问。
int gnVariable;
void getVariableValue(int *pnValue)
{
acquireLock(); //Acquires the protection mechanism
*pnValue = gnVariable;
releaseLock(); //Releasing the protection mechanism
}
我想将我的API签名更改为更加用户友好的
int getVariableValue(void);
我应该如何重写该功能 - 以便API的用户不必担心锁定/解锁细节?
答案 0 :(得分:9)
由于您将C ++作为选项,因此可以包装互斥锁定/解锁。然后,您可以直接返回值:
class lock_wrapper
{
public:
lock_wrapper()
{
acquireLock();
}
~lock_wrapper()
{
releaseLock();
}
};
int getVariableValue()
{
lock_wrapper lw;
return gnVariable;
}
如果您需要对可能引发异常的代码进行锁定/解锁,这也会派上用场。
答案 1 :(得分:8)
您返回局部变量的副本。类似的东西:
int getVariableValue(void)
{
int local= 0;
acquireLock();
local = gnVariable;
releaseLock();
return local;
}
作为旁注,最好采用RAII原则来锁定,而不是acquireLock
和releaseLock
方法。