﻿# V1088\. No objects are passed to the 'std::scoped\_lock' constructor\. No locking will be performed\. This can cause concurrency issues\.

Анализатор обнаружил ситуацию, при которой объект типа 'std::scoped\_lock' конструируется без переданных ему аргументов, т\.е\. без захвата объектов блокировки\. Это может привести к проблемам в многопоточном приложении: состоянию гонки, гонке данных и т\.д\.

Начиная с C\+\+17, в стандартной библиотеке присутствует шаблон класса '[std::scoped\_lock](https://en.cppreference.com/w/cpp/thread/scoped_lock)'\. Он был внедрен в качестве удобной альтернативы '[std::lock\_guard](https://en.cppreference.com/w/cpp/thread/lock_guard)', когда требуется захватить произвольное число [объектов блокировки](https://en.cppreference.com/w/cpp/named_req/Lockable) за раз\. При этом используется [алгоритм](https://en.cppreference.com/w/cpp/thread/lock), позволяющий избежать взаимных блокировок\.

Однако дизайн нового типа содержит определенные недостатки\. Рассмотрим объявление одного из его конструкторов:

```cpp
template <class ...MutexTypes>
class scoped_lock
{
  // ....
public:
  explicit scoped_lock(MutexTypes &...m);
  // ....
};
```

Конструктор принимает произвольное число аргументов типа 'MutexTypes' \(parameter pack\)\. Возможны ситуации, когда parameter pack 'MutexTypes' может быть пустым\. Вследствие этого возможно создание RAII\-объекта без блокировок:

```cpp
void bad()
{
  // ....
  std::scoped_lock lock;
  // ....
}
```

Для исправления стоит инициализировать 'std::scoped\_lock' объектом блокировки:

```cpp
std::mutex mtx;

void good()
{
  // ....
  std::scoped_lock lock { mtx };
  // ....
}
```