Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Thread-safe get (accessor method)

I'm currently using the following code for thread-safe access of a variable.

int gnVariable;

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

I would like to change my API signature to a more user-friendly

int getVariableValue(void);

How should I rewrite the function - such that the users of the API don't have to bother about the locking/unlocking details?

like image 660
sonofdelphi Avatar asked Dec 03 '22 12:12

sonofdelphi


2 Answers

Since you gave C++ as an option, you can wrap the mutex lock/unlock. You can then return the value directly:

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

int getVariableValue()
{
    lock_wrapper lw;
    return gnVariable;
}

This will also come in handy if you ever need to do a lock/unlock around code that can throw an exception.

like image 164
R Samuel Klatchko Avatar answered Feb 04 '23 01:02

R Samuel Klatchko


You return a copy of the local variable. Something like:

int getVariableValue(void)
{
  int local= 0;
  acquireLock();
  local = gnVariable;
  releaseLock();
  return local;
}

As a side note, it is better to RAII principle for locking instead of acquireLock and releaseLock methods.

like image 30
Naveen Avatar answered Feb 04 '23 03:02

Naveen