线程安全get(访问器方法)

son*_*phi 5 c c++ multithreading

我目前正在使用以下代码进行变量的线程安全访问.

int gnVariable;

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

我想将我的API签名更改为更加用户友好

int getVariableValue(void);
Run Code Online (Sandbox Code Playgroud)

我应该如何重写函数 - 这样API的用户不必担心锁定/解锁细节?

R S*_*hko 9

既然你给了C++作为选项,你可以包装互斥锁/解锁.然后,您可以直接返回值:

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

int getVariableValue()
{
    lock_wrapper lw;
    return gnVariable;
}
Run Code Online (Sandbox Code Playgroud)

如果您需要对可能引发异常的代码执行锁定/解锁,这也会派上用场.


Nav*_*een 8

您返回局部变量的副本.就像是:

int getVariableValue(void)
{
  int local= 0;
  acquireLock();
  local = gnVariable;
  releaseLock();
  return local;
}
Run Code Online (Sandbox Code Playgroud)

作为旁注,对于锁定代替和方法,RAII原则更好.acquireLockreleaseLock

  • @sonofdelphi:局部变量应该被一个不错的编译器优化掉 - 它会将`gnVariable`直接复制到返回值位置. (2认同)