Sobes.tech
Назад к вопросам
Junior — Middle
102

Что отличает использование std::mutex от применения std::atomic в управлении доступом к данным?

Компании, где спрашивали
Телкор

Ответ от нейросети

sobes.tech AI

std::mutex и std::atomic служат для обеспечения безопасности доступа к данным в многопоточной среде, но работают по-разному.

  • std::mutex — это механизм блокировки, который позволяет одному потоку эксклюзивно владеть ресурсом. Другие потоки, пытающиеся захватить мьютекс, будут ждать, пока он не освободится. Это подходит для защиты сложных структур данных или критических секций, где операции не могут быть атомарными.

  • std::atomic обеспечивает атомарные операции над отдельными переменными (например, целочисленными), без блокировок. Это более легковесный и быстрый способ синхронизации, но ограничен простыми типами и операциями.

Пример использования std::atomic для счетчика:

#include <atomic>
#include <thread>
#include <vector>
#include <iostream>

std::atomic<int> counter(0);

void increment() {
    for (int i = 0; i < 1000; ++i) {
        ++counter; // атомарное увеличение
    }
}

int main() {
    std::vector<std::thread> threads;
    for (int i = 0; i < 10; ++i) {
        threads.emplace_back(increment);
    }
    for (auto& t : threads) {
        t.join();
    }
    std::cout << "Counter: " << counter << std::endl;
    return 0;
}

Если же нужно защитить сложную структуру данных, например, вектор, то используют std::mutex:

#include <mutex>
#include <vector>

std::vector<int> data;
std::mutex mtx;

void add_data(int value) {
    std::lock_guard<std::mutex> lock(mtx);
    data.push_back(value);
}

Таким образом, std::atomic эффективен для простых атомарных операций, а std::mutex — для защиты более сложных критических секций.