linux C++多线程同步方法

424 阅读2分钟

在 Linux 中,C++ 提供了一些多线程同步方法,可以用于确保多个线程之间的协调和互斥访问共享资源。以下是几种常见的多线程同步方法:

  1. std::mutex 和 std::lock_guard:
    C++ 11 引入的 std::mutex 是互斥量类,用于提供互斥访问共享资源的能力。可以使用 std::lock_guard 来自动管理互斥量的加锁和解锁,确保在退出作用域时自动解锁。例如:

    std::mutex mtx;
    // 线程1
    {
        std::lock_guard<std::mutex> lock(mtx); // 自动加锁
        // 访问共享资源
    } // 自动解锁
    
    // 线程2
    {
        std::lock_guard<std::mutex> lock(mtx); // 自动加锁
        // 访问共享资源
    } // 自动解锁
    
  2. std::condition_variable:
    std::condition_variable 是条件变量类,可以用于线程间的等待和通知机制。一个线程可以等待某一条件的满足,而另一线程可以在合适的时机对条件变量进行通知。例如:

    std::mutex mtx;
    std::condition_variable cv;
    bool ready = false;
    
    // 线程1
    {
        std::unique_lock<std::mutex> lock(mtx); // 使用 unique_lock 实现可手动加锁和解锁
        while (!ready) {
            cv.wait(lock); // 等待条件满足
        }
        // 访问共享资源
    }
    
    // 线程2
    {
        std::lock_guard<std::mutex> lock(mtx); // 使用 lock_guard 自动加锁和解锁
        ready = true;
        cv.notify_one(); // 发送条件满足的通知给等待的线程
    }
    
  3. std::atomic:
    std::atomic 提供了原子操作,用于确保共享变量的原子性操作,避免线程间竞争。std::atomic 可以让多个线程对同一个变量进行原子操作。例如:

    std::atomic<int> counter(0); // 原子整型变量
    
    // 线程1
    counter.fetch_add(1); // 原子加1操作
    
    // 线程2
    counter.fetch_sub(1); // 原子减1操作
    
  4. std::mutex 和 std::condition_variable 的组合使用:
    std::mutex 和 std::condition_variable 可以结合使用,实现更复杂的线程同步需求,如互斥队列、生产者-消费者模型等。

以上是一些常见的多线程同步方法,不同的方法适用于不同的场景和需求。在使用这些方法时,需要考虑线程安全性、性能、死锁避免等问题,以确保多线程程序的正确性和效率。