Sobes.tech
Junior — Middle
154

Veri erişimini kontrol etmede std::mutex kullanımı ile std::atomic kullanımı arasındaki fark nedir?

Sorulan şirketler
Телкор

AI'dan gelen yanıt

sobes.tech yapay zeka

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 — для защиты более сложных критических секций.