/
AirLexa
/
06
Обзор
Документация
Войти
/
AirLexa
/
06
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lesson_02/Task_3/Task_3.cpp
71 строка
2 KB
AirLexa
урок 2
17 июн 2026, 14:06
Верифицирован
17 июн 2026, 14:06
4dab469
Код
Авторство
О чём код?
#include <iostream> #include <mutex> #include <utility> #include <thread> class Data { public: int value; mutable std::mutex mtx; explicit Data(int val) : value(val) {} }; // Вариант 1: Использование std::lock и std::lock_guard void swap_using_lock(Data& lhs, Data& rhs) { if (&lhs == &rhs) return; std::lock(lhs.mtx, rhs.mtx); std::lock_guard<std::mutex> lockA(lhs.mtx, std::adopt_lock); std::lock_guard<std::mutex> lockB(rhs.mtx, std::adopt_lock); std::swap(lhs.value, rhs.value); } // Вариант 2: Использование std::scoped_lock void swap_using_scoped_lock(Data& lhs, Data& rhs) { if (&lhs == &rhs) return; std::scoped_lock lock(lhs.mtx, rhs.mtx); std::swap(lhs.value, rhs.value); } // Вариант 3: Использование std::unique_lock void swap_using_unique_lock(Data& lhs, Data& rhs) { if (&lhs == &rhs) return; std::unique_lock<std::mutex> lockA(lhs.mtx, std::defer_lock); std::unique_lock<std::mutex> lockB(rhs.mtx, std::defer_lock); std::lock(lockA, lockB); std::swap(lhs.value, rhs.value); } void print_data(const Data& d1, const Data& d2) { std::cout << "Data 1: " << d1.value << " | Data 2: " << d2.value << "\n"; } int main() { setlocale(LC_ALL, "RU"); Data d1(10); Data d2(20); std::cout << "Исходное состояние:\n"; print_data(d1, d2); std::cout << "\nОбмен с помощью std::lock и std::lock_guard...\n"; swap_using_lock(d1, d2); print_data(d1, d2); std::cout << "\nОбмен с помощью std::scoped_lock...\n"; swap_using_scoped_lock(d1, d2); print_data(d1, d2); std::cout << "\nОбмен с помощью std::unique_lock...\n"; swap_using_unique_lock(d1, d2); print_data(d1, d2); return 0; }