登录
首页 >  文章 >  linux

LinuxC++多线程同步详解

时间:2025-02-28 10:44:28 496浏览 收藏

Linux下C++多线程编程需要高效的同步机制避免数据竞争。本文详解了五种常用的同步方法:互斥锁(Mutex)用于保护共享资源;条件变量(Condition Variable)实现线程间的等待和通知;信号量(Semaphore)控制对共享资源的访问次数;原子操作(Atomic Operations)无需锁即可保证线程安全;屏障(Barrier)确保多个线程在特定点同步。文章通过代码示例演示了每种方法的用法,并指出了选择同步机制需根据实际应用场景而定,帮助开发者在Linux环境下高效进行C++多线程编程。

Linux下C++多线程同步怎么做

Linux环境下C++多线程编程,线程同步至关重要。本文将介绍几种常用的同步方法:

一、互斥锁 (Mutex)

互斥锁是基础的同步机制,用于保护共享资源,防止数据竞争。

#include 
#include 
#include 

std::mutex mtx; // 全局互斥锁

void print_block(int n, char c) {
    mtx.lock(); // 加锁
    for (int i = 0; i < n; ++i) {
        std::cout << c;
    }
    mtx.unlock(); // 解锁
}

int main() {
    std::thread th1(print_block, 50, '*');
    std::thread th2(print_block, 50, '$');

    th1.join();
    th2.join();

    return 0;
}

二、条件变量 (Condition Variable)

条件变量实现线程间的等待和通知。

#include 
#include 
#include 
#include 

std::mutex mtx;
std::condition_variable cv;
bool ready = false;

void print_id(int id) {
    std::unique_lock<:mutex> lck(mtx);
    cv.wait(lck, []{return ready;}); // 等待条件满足
    std::cout << "thread " << id << std::endl;
}

void go() {
    std::lock_guard<:mutex> lck(mtx);
    ready = true;
    cv.notify_all(); // 通知所有等待线程
}

int main() {
    std::thread threads[10];
    for (int i = 0; i < 10; ++i) {
        threads[i] = std::thread(print_id, i);
    }
    go();
    for (auto& th : threads) {
        th.join();
    }
    return 0;
}

三、信号量 (Semaphore)

信号量是更高级的同步机制,控制对共享资源的访问次数。

#include 
#include 
#include 

std::binary_semaphore sem(0); // 二进制信号量

void print_block(int n, char c) {
    sem.acquire(); // 等待信号量
    for (int i = 0; i < n; ++i) {
        std::cout << c;
    }
}

void go() {
    std::this_thread::sleep_for(std::chrono::seconds(1)); // 模拟任务
    sem.release(); // 释放信号量
}

int main() {
    std::thread th1(print_block, 50, '*');
    std::thread th2(print_block, 50, '$');
    std::thread t(go);

    th1.join();
    th2.join();
    t.join();

    return 0;
}

四、原子操作 (Atomic Operations)

原子操作无需锁即可保证线程安全。

#include 
#include 
#include 

std::atomic counter(0);

void increment() {
    for (int i = 0; i < 100000; ++i) {
        ++counter;
    }
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);

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

    std::cout << counter << std::endl;
    return 0;
}

五、屏障 (Barrier)

屏障确保多个线程在特定点同步。

#include 
#include 
#include 

std::barrier bar(2); // 创建一个屏障,等待两个线程

void print_hello() {
    std::cout << "Hello ";
    bar.wait(); // 等待屏障
    std::cout << "World!" << std::endl;
}

int main() {
    std::thread t1(print_hello);
    std::thread t2(print_hello);

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

    return 0;
}

选择合适的同步机制取决于具体应用场景。 以上示例代码仅供参考,实际应用中可能需要更复杂的同步策略。

好了,本文到此结束,带大家了解了《LinuxC++多线程同步详解》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多文章知识!

相关阅读
更多>
最新阅读
更多>
课程推荐
更多>