Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 线程安全get(访问器方法)_C++_C_Multithreading - Fatal编程技术网

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;
}

作为一个旁注,最好是锁定原则,而不是<代码>获取锁和 RelaseLoCK< <代码>方法> < /P> < P>因为您给了C++作为选项,可以包装互斥锁/解锁。然后可以直接返回值:

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的用户必须手动释放/解锁信号量。如果你不按照塞缪尔和纳文的建议去做