Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Copy constructor related compiler error

I have a resource that is shared between two concurrent threads. The resource contains a vector that both threads need to read and write to. Hence, I make access to the vector exclusive through a mutex. So far so good, sharing of resource works well without any problems.

However, the problem starts when I try to write a copy constructor for sharedResource as follows.

class sharedResource{
public:
    sharedResource(){} 
    sharedResource(const sharedResource &other) {
        vec = other.GetVec();
    }
    std::vector<int> GetVec() const {  
        std::lock_guard<std::mutex> lock(vecMutex); // Gives error
        return vec;
    }

private:
    std::vector<int> vec;
    std::mutex vecMutex;
};

int main()
{
    sharedResource bacon1;
    sharedResource bacon2 = bacon1;
    return 0;
}

For this code, I get error

error C2664: 'std::lock_guard<std::mutex>::lock_guard(const std::lock_guard<std::mutex> &)' : cannot convert argument 1 from 'const std::mutex' to 'std::mutex &'

Could you please explain why am I getting the error and if there is a way to use the mutex without getting the compiler error.

If all else fails, I am going to create a thread unsafe GetVec2 member function, that will return vec without going through lock guard. But I would like to avoid this eventuality.

std::vector<int> GetVec2() const {
    return vec;
}
like image 496
The Vivandiere Avatar asked Apr 20 '26 01:04

The Vivandiere


1 Answers

This happens because getVec() is a const method but vecMutex is not mutable. You should either make getVec() non-const so it can modify (acquire) the mutex, or make the mutex mutable so it can be acquired by const methods too. I'd probably do the latter.

like image 151
John Zwinck Avatar answered Apr 22 '26 17:04

John Zwinck