跳至主要內容

52.C++线程同步_锁

约 454 字大约 2 分钟

mutex 加锁解锁

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex mtx;  // 互斥锁

void worker(int id) {
    std::cout << "线程 " << id << " 尝试获取锁...\n";

    mtx.lock();  // 手动加锁
    std::cout << "线程 " << id << " 获取了锁,正在工作...\n";
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作
    std::cout << "线程 " << id << " 任务完成,释放锁。\n";
    mtx.unlock();  // 手动解锁

    std::cout << "线程 " << id << " 退出。\n";
}

int main() {
    std::thread t1(worker, 1);
    std::thread t2(worker, 2);

    t1.join();
    t2.join();

    return 0;
}

lock_guard 加锁自动解锁( lock_guard 生命周期结束自动解锁)

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex mtx;  // 互斥锁
int sharedData = 0;  // 共享数据

// 写线程(生产者)
void writeData() {
    for (int i = 1; i <= 5; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(500)); // 模拟处理延迟
        std::lock_guard<std::mutex> lock(mtx); // 加锁,自动解锁
        sharedData = i;
        std::cout << "Writer: 写入数据 " << i << std::endl;
    }
}

// 读线程(消费者)
void readData() {
    for (int i = 1; i <= 5; ++i) {
        std::this_thread::sleep_for(std::chrono::milliseconds(700)); // 模拟处理延迟
        std::lock_guard<std::mutex> lock(mtx); // 加锁,自动解锁
        std::cout << "Reader: 读取数据 " << sharedData << std::endl;
    }
}

int main() {
    std::thread writer(writeData);
    std::thread reader(readData);

    writer.join();
    reader.join();

    return 0;
}


unique_lock 加锁后需要手动解锁

#include <iostream>
#include <thread>
#include <mutex>
#include <chrono>

std::mutex mtx;  // 互斥锁

void worker(int id) {
    std::cout << "线程 " << id << " 尝试获取锁...\n";

    std::unique_lock<std::mutex> lock(mtx); // 获取锁
    std::cout << "线程 " << id << " 获取了锁,正在工作...\n";
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟工作

    lock.unlock();  // 手动解锁
    std::cout << "线程 " << id << " 手动释放了锁。\n";

    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟其他操作

    lock.lock(); // 重新加锁
    std::cout << "线程 " << id << " 重新获取锁,执行额外操作。\n";
    std::this_thread::sleep_for(std::chrono::seconds(1));
    std::cout << "线程 " << id << " 任务完成。\n";
}

int main() {
    std::thread t1(worker, 1);
    std::thread t2(worker, 2);

    t1.join();
    t2.join();

    return 0;
}