legongju.com
我们一直在努力
2025-01-12 01:43 | 星期天

linux c++多线程如何同步

在Linux环境下使用C++多线程时,同步是一个重要的问题,以确保数据的一致性和线程安全。C++提供了多种同步机制,包括互斥锁(mutex)、条件变量(condition variable)、读写锁(reader-writer lock)等。以下是一些常见的同步方法:

1. 互斥锁(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;
    }
    std::cout << '\n';
    mtx.unlock();
}

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

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

    return 0;
}

2. 条件变量(Condition Variable)

条件变量用于线程间的通信,允许一个线程等待某个条件成立。

#include 
#include 
#include 
#include 

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

void print_ready_message() {
    std::unique_lock lck(mtx);
    while (!ready) { // 如果ready为false,则等待
        cv.wait(lck);
    }
    std::cout << "Ready!\n";
}

void set_ready() {
    std::lock_guard lck(mtx);
    ready = true;
    cv.notify_one(); // 唤醒等待的线程
}

int main() {
    std::thread th1(print_ready_message);
    std::thread th2(set_ready);

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

    return 0;
}

3. 读写锁(Reader-Writer Lock)

读写锁允许多个线程同时读取共享资源,但只允许一个线程写入。

#include 
#include 
#include 
#include 

std::shared_mutex rw_mtx; // 读写锁
int data = https://www.yisu.com/ask/0;"hljs">void read_data() {
    std::shared_lock lock(rw_mtx);
    std::cout << "Read: " << data << '\n';
}

void write_data(int value) {
    std::unique_lock lock(rw_mtx);
    data = https://www.yisu.com/ask/value;"Write: " << data << '\n';
}

int main() {
    std::thread th1(read_data);
    std::thread th2(write_data, 42);
    std::thread th3(read_data);

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

    return 0;
}

4. 原子操作(Atomic Operations)

原子操作是不可中断的操作,用于简单的同步需求。

#include 
#include 
#include 

std::atomic counter(0);

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

int main() {
    std::thread th1(increment);
    std::thread th2(increment);

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

    std::cout << "Counter: " << counter << '\n';

    return 0;
}

总结

选择合适的同步机制取决于具体的应用场景和需求。互斥锁适用于简单的保护共享资源,条件变量适用于线程间的通信,读写锁适用于读多写少的场景,原子操作适用于简单的计数器等场景。在实际编程中,应根据具体情况选择合适的同步方法,以确保线程安全和数据一致性。

未经允许不得转载 » 本文链接:https://www.legongju.com/article/47201.html

相关推荐

  • c#接口有什么用

    c#接口有什么用

    C# 接口(interface)是一种类型,它定义了一组方法、属性、事件和索引器,这些方法、属性、事件和索引器可以由实现该接口的任何类或结构来实现 多重继承:C# 不...

  • c#中括号的作用是什么

    c#中括号的作用是什么

    在C#中,括号主要有以下几种作用: 数组和索引器的初始化与访问:括号用于定义和操作数组或索引器。例如: int[] numbers = new int[5]; // 定义一个包含5个元素...

  • c++模板的作用是什么

    c++模板的作用是什么

    C++ 模板(template)是一种编程工具,它允许程序员在不知道数据类型的情况下编写通用的代码。模板的主要作用有以下几点: 代码重用:通过模板,程序员可以编写一...

  • c++中头文件的作用是什么

    c++中头文件的作用是什么

    在C++中,头文件(.h文件)主要用于声明函数、类、模板等程序实体 提高代码的可读性和模块化:通过将声明与定义分离,可以使代码更加清晰和易于理解。头文件提供...

  • linux和java怎样搭配使用

    linux和java怎样搭配使用

    Linux和Java是经典的开发组合,Java的跨平台特性使其在Linux上运行非常方便。以下是在Linux系统上搭配使用Java的步骤和注意事项:
    安装Java开发工具包(JDK)...

  • 在linux上使用java方便吗

    在linux上使用java方便吗

    在Linux上使用Java是非常方便的。Linux系统提供了多种安装Java的方法,并且有大量的工具和资源可供开发者使用。以下是在Linux上安装Java的步骤以及常用Java命令的...

  • linux和java怎样整合

    linux和java怎样整合

    Linux和Java的整合主要涉及到在Linux系统上安装Java运行环境(JRE)和Java开发工具包(JDK),配置环境变量,以及使用Java进行开发。以下是一些关于如何在Linux上...

  • java在linux上性能如何

    java在linux上性能如何

    Java在Linux上的性能表现通常是优秀的,主要得益于Linux系统的高效资源管理和Java虚拟机(JVM)的优化。以下是一些关于Java在Linux上性能优化的建议:
    Java...