C++ 线程安全get(访问器方法)
我目前正在使用以下代码对变量进行线程安全访问C++ 线程安全get(访问器方法),c++,c,multithreading,C++,C,Multithreading,我目前正在使用以下代码对变量进行线程安全访问 int gnVariable; void getVariableValue(int *pnValue) { acquireLock(); //Acquires the protection mechanism *pnValue = gnVariable; releaseLock(); //Releasing the protection mechanism } 我想将我的API签名更改为更为用户友好的 int getVar
int gnVariable;
void getVariableValue(int *pnValue)
{
acquireLock(); //Acquires the protection mechanism
*pnValue = gnVariable;
releaseLock(); //Releasing the protection mechanism
}
我想将我的API签名更改为更为用户友好的
int getVariableValue(void);
我应该如何重写函数?这样API的用户就不必担心锁定/解锁的细节了 返回局部变量的副本。比如:
int getVariableValue(void)
{
int local= 0;
acquireLock();
local = gnVariable;
releaseLock();
return local;
}
作为一个旁注,最好是锁定原则,而不是<代码>获取锁和
class lock_wrapper
{
public:
lock_wrapper()
{
acquireLock();
}
~lock_wrapper()
{
releaseLock();
}
};
int getVariableValue()
{
lock_wrapper lw;
return gnVariable;
}
如果您需要对可能引发异常的代码执行锁定/解锁操作,这也会很有用。在C中执行相同操作有什么想法吗?我曾经使用计数信号量来实现这一点。某些RTOS中的信号量计数支持getValue()操作,该操作以原子方式运行。@sonofdelphi-对于C,您应该使用Naveen答案中的技术。本地副本似乎有点不雅。:)索诺弗德尔菲:塞缪尔·克拉奇科是一个更好的解决方案。我只是想演示如何使用本地复制。@sonofdelphi:本地变量应该由一个合适的编译器进行优化-它将
gnVariable
直接复制到返回值位置。我不明白你的问题。您建议的API的两个版本都没有公开锁定细节。如果更改为第二个版本-int getVariable(void),则API的用户必须手动释放/解锁信号量。如果你不按照塞缪尔和纳文的建议去做