The analyzer has detected a problem. An object of the 'std::scoped_lock' type is constructed without arguments passed to it — i.e., without lockable objects. This can lead to problems in a multithreaded application: race condition, data race, etc.
Since C++17, the standard library has 'std::scoped_lock' class template. It was implemented as a convenient alternative to 'std::lock_guard'. We can use 'std::scoped_lock' when we need to lock an arbitrary number of lockable objects at a time. The class provides an algorithm that prevents deadlocks.
However, the new design has certain disadvantages. Let's see how we can declare one of its constructors:
template <class ...MutexTypes> class scoped_lock { // .... public: explicit scoped_lock(MutexTypes &...m); // .... };
The constructor receives an arbitrary number of arguments of the 'MutexTypes' (parameter pack) type. The parameter pack 'MutexTypes' can be empty. As a result, we can get a RAII object without locks:
void bad() { // .... std::scoped_lock lock; // .... }
To fix this, we should initialize 'std::scoped_lock' with a lockable object:
std::mutex mtx; void good() { // .... std::scoped_lock lock { mtx }; // .... }
This diagnostic is classified as:
|