---
title: Синхронизация потоков
seo:
  title: Синхронизация потоков — C++ Developer
  description: Тема «Синхронизация потоков» для собеседования C++ Developer. Как синхронизировать передачи информации между потоками? Какая разница между мьютекс и семафором?
---

[Все темы C++ Developer](/c-developer)

## <strong>Как синхронизировать передачи информации между потоками?</strong> [#q-14bee738d69b81e2af01e71bd39580eb]

Для синхронизации передачи информации между потоками в C++ используются различные механизмы синхронизации&#58;

{/* prettier-ignore */}
1. <strong>Мьютексы (</strong><code>std&#58;&#58;mutex</code><strong>)</strong>&#58;

    - Предотвращают одновременный доступ к критическим участкам кода.

    ```cpp
    #include <mutex>
    std::mutex mtx;
    void threadFunc() {
        std::lock_guard<std::mutex> lock(mtx);
        // Доступ к общим данным
    }
    ```

1. <strong>Условные переменные (</strong><code>std&#58;&#58;condition&#95;variable</code><strong>)</strong>&#58;

    - Обеспечивают ожидание одного потока до наступления определённого условия, установленного другим потоком.

    ```cpp
    #include <condition_variable>
    std::mutex mtx;
    std::condition_variable cv;
    bool ready = false;
    void producer() {
        std::unique_lock<std::mutex> lock(mtx);
        // Подготовка данных
        ready = true;
        cv.notify_one(); // Уведомление потребителя
    }
    void consumer() {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return ready; }); // Ожидание готовности
        // Обработка данных
    }
    ```

1. <strong>Атомарные операции (</strong><code>std&#58;&#58;atomic</code><strong>)</strong>&#58;

    - Обеспечивают атомарные операции над поддерживаемыми типами. Реализация может использовать внутренние блокировки; несколько операций не становятся одной неделимой последовательностью.

    ```cpp
    #include <atomic>
    std::atomic<int> counter(0);
    void increment() {
        counter++;
    }
    ```

1. <strong>Блокировки с отсчётом (</strong><code>std&#58;&#58;latch</code> <strong>и</strong> <code>std&#58;&#58;barrier</code> <strong>в C++20)</strong>&#58;

    - Координируют потоки, позволяя им ожидать друг друга в определённых точках выполнения.

    ```cpp
    #include <latch>
    std::latch latch(1);
    void threadFunc1() {
        // Работа потока
        latch.count_down(); // Уменьшение счётчика
    }
    void threadFunc2() {
        latch.wait(); // Ожидание обнуления счётчика
        // Работа потока
    }
    ```

:::note[Ссылки для изучения]

1. [Потоки в C++](https://habr.com/ru/articles/182610/)
   :::

---

## <strong>Какая разница между мьютекс и семафором?</strong> [#q-14bee738d69b81daa547f0aacfc97e40]

Оба механизма служат для синхронизации, но используются в разных сценариях в зависимости от потребностей в ограничении доступа к ресурсам.

#### Мьютекс <code>&#40;Mutex&#41;</code>&#58;

- <strong>Назначение</strong>&#58; Используется для обеспечения взаимного
  исключения при доступе к общим ресурсам.

- <strong>Количество потоков</strong>&#58; Позволяет доступ только одному потоку
  в каждый момент времени.

- <strong>Использование</strong>&#58; Легковесен и используется для защиты
  критических участков кода.

- <strong>Поведение</strong>&#58; Поток, захвативший мьютекс, должен освободить
  его.

  ```cpp
  std::mutex mtx;
  mtx.lock();
  // Критическая секция
  mtx.unlock();
  ```

#### Семафор <code>&#40;Semaphore&#41;</code>&#58;

- <strong>Назначение</strong>&#58; Управляет доступом к ресурсу с ограниченным
  числом экземпляров.

- <strong>Количество потоков</strong>&#58; Позволяет доступ нескольким потокам
  одновременно до определённого лимита.

- <strong>Использование</strong>&#58; Может использоваться для более сложных
  сценариев синхронизации, таких как контроль доступа к пулу ресурсов.

- <strong>Поведение</strong>&#58; Поддерживает счётчик, который увеличивается
  при освобождении и уменьшается при захвате.

  ```cpp
  std::counting_semaphore<3> sem(3);
  sem.acquire();
  // Доступ к ресурсу
  sem.release();
  ```

#### Основные отличия&#58;

- <strong>Мьютекс</strong>&#58; Гарантирует доступ только одному потоку.

- <strong>Семафор</strong>&#58; Может разрешить доступ нескольким потокам до
  заданного лимита.

:::note[Ссылки для изучения]

1. [Потоки в C++](https://habr.com/ru/articles/182610/)
   :::
