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

时间:2010-05-17 05:41:16

标签: c++ c multithreading

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

int gnVariable;

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

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

int getVariableValue(void);

我应该如何重写该功能 - 以便API的用户不必担心锁定/解锁细节?

2 个答案:

答案 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原则来锁定,而不是acquireLockreleaseLock方法。