linux

Linux C++中如何实现并发控制

小樊
43
2025-07-04 00:56:09
栏目: 编程语言

在Linux环境下使用C++实现并发控制,通常涉及以下几个方面:

  1. 线程管理:使用C++11引入的<thread>库来创建和管理线程。
  2. 同步机制:利用互斥锁(std::mutex)、条件变量(std::condition_variable)、原子操作(std::atomic)等来同步线程间的访问。
  3. 并发数据结构:使用线程安全的数据结构,如std::atomic变量、线程安全的队列等。
  4. 避免竞态条件:确保对共享资源的访问是原子性的或通过适当的同步机制进行保护。

以下是一个简单的示例,展示了如何在C++中使用std::mutexstd::lock_guard来实现互斥锁,从而控制对共享资源的访问:

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>

std::mutex mtx; // 全局互斥锁
int shared_resource = 0; // 共享资源

void increment_resource(int iterations) {
    for (int i = 0; i < iterations; ++i) {
        std::lock_guard<std::mutex> lock(mtx); // 自动管理锁的生命周期
        ++shared_resource;
    }
}

int main() {
    const int num_threads = 10;
    const int iterations_per_thread = 100000;

    std::vector<std::thread> threads;

    // 创建多个线程
    for (int i = 0; i < num_threads; ++i) {
        threads.emplace_back(increment_resource, iterations_per_thread);
    }

    // 等待所有线程完成
    for (auto& t : threads) {
        t.join();
    }

    std::cout << "Final value of shared_resource: " << shared_resource << std::endl;

    return 0;
}

在这个示例中,我们创建了多个线程,每个线程都会对一个共享资源进行递增操作。为了防止多个线程同时修改共享资源,我们使用了std::mutexstd::lock_guard来确保每次只有一个线程可以访问共享资源。

其他并发控制机制

  1. 条件变量:用于线程间的等待和通知机制。

    #include <iostream>
    #include <thread>
    #include <mutex>
    #include <condition_variable>
    
    std::mutex mtx;
    std::condition_variable cv;
    bool ready = false;
    
    void worker_thread() {
        std::unique_lock<std::mutex> lock(mtx);
        cv.wait(lock, []{ return ready; }); // 等待条件变量
    
        // 条件满足后执行操作
        std::cout << "Worker thread is processing data\n";
    }
    
    void trigger_work() {
        std::lock_guard<std::mutex> lock(mtx);
        ready = true;
        cv.notify_one(); // 通知等待的线程
    }
    
    int main() {
        std::thread worker(worker_thread);
        std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟一些准备工作
        trigger_work();
        worker.join();
        return 0;
    }
    
  2. 原子操作:用于实现无锁编程。

    #include <iostream>
    #include <thread>
    #include <atomic>
    
    std::atomic<int> shared_resource(0);
    
    void increment_resource(int iterations) {
        for (int i = 0; i < iterations; ++i) {
            ++shared_resource; // 原子操作
        }
    }
    
    int main() {
        const int num_threads = 10;
        const int iterations_per_thread = 100000;
    
        std::vector<std::thread> threads;
    
        for (int i = 0; i < num_threads; ++i) {
            threads.emplace_back(increment_resource, iterations_per_thread);
        }
    
        for (auto& t : threads) {
            t.join();
        }
    
        std::cout << "Final value of shared_resource: " << shared_resource << std::endl;
    
        return 0;
    }
    

通过这些机制,可以在Linux环境下使用C++实现高效的并发控制。

0
看了该问题的人还看了