首页 > 编程语言 >深入理解 C++11 多线程编程:从入门到实践

深入理解 C++11 多线程编程:从入门到实践

时间:2024-07-02 12:26:45浏览次数:3  
标签:11 std include lock C++ 线程 多线程

C++ 多线程编程是指使用 C++ 提供的多线程库来并行执行代码块,从而提高程序的性能和响应能力。C++11 标准引入了多线程支持,使得在 C++ 中进行多线程编程变得更加容易和直观。以下是 C++ 多线程编程的基本知识,并附有例子代码。

多线程的基本概念

  1. 线程(Thread):线程是进程中的一个执行单元,每个线程有自己的堆栈,但与其他线程共享程序的全局内存。
  2. 竞争条件(Race Condition):多个线程并发访问同一内存区域并试图同时修改它,可能导致未定义行为。
  3. 互斥锁(Mutex):互斥锁用来确保某段代码在同一时间只被一个线程执行。
  4. 条件变量(Condition Variable):对于某些需要线程同步的情况,可使用条件变量。

C++11 中的多线程编程

C++11 提供了一些新的类和函数来支持多线程编程:

  • std::thread:用于创建和管理线程。
  • std::mutex:用于互斥锁,以防止多线程同时访问共享资源。
  • std::lock_guard 和 std::unique_lock:用于管理互斥锁。
  • std::condition_variable:用于线程间的条件同步。

示例代码

下面的示例代码展示了如何在 C++ 中使用 std::thread 创建线程,使用 std::mutex 来保证对共享资源的互斥访问,并使用 std::condition_variable 进行线程同步。

示例 1:基本线程创建和管理
#include <iostream>
#include <thread>

void print_hello() {
    std::cout << "Hello from thread!" << std::endl;
}

int main() {
    std::thread t(print_hello); // 创建一个新线程
    t.join(); // 等待线程完成
    return 0;
}
示例 2:互斥锁保护共享数据
#include <iostream>
#include <thread>
#include <vector>
#include <mutex>

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

void increment() {
    for (int i = 0; i < 1000; ++i) {
        std::lock_guard<std::mutex> lock(mtx); // 获取互斥锁
        ++counter;
    }
}

int main() {
    std::vector<std::thread> threads;

    // 创建多个线程
    for (int i = 0; i < 10; ++i) {
        threads.push_back(std::thread(increment));
    }

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

    std::cout << "Counter: " << counter << std::endl; // 输出计数器值
    return 0;
}
示例 3:条件变量同步线程
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

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

void print_id(int id) {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return ready; }); // 等待 ready 为 true
    // 任何线程执行到这里,ready 不再为 false
    std::cout << "Thread " << id << std::endl;
}

void set_ready() {
    std::this_thread::sleep_for(std::chrono::seconds(1));
    {
        std::lock_guard<std::mutex> lock(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);
    }

    std::thread t(set_ready);

    for (auto& thr : threads) {
        thr.join();
    }
    t.join();
    return 0;
}

解释

  1. 创建线程std::thread 类用于创建线程。线程的入口函数可以是函数、lambda 表达式、成员函数等。
  2. 互斥锁std::mutex 和 std::lock_guard 用于线程安全的访问共享资源。std::lock_guard 也可以使用 std::unique_lock 替代,它提供更多的控制。
  3. 条件变量std::condition_variable 用于线程间的等待和通知机制。结合 std::unique_lock 使用,用 notify_one 或 notify_all 唤醒等待的线程。

小结

多线程编程可以显著提高程序的执行效率,尤其是在 I/O 密集型任务或多核环境下。通过 C++11 提供的多线程支持,可以更加方便地进行线程的创建、管理和同步。在实际编程中,要特别注意线程安全和死锁等潜在问题。

标签:11,std,include,lock,C++,线程,多线程
From: https://blog.csdn.net/m0_72877724/article/details/140110270

相关文章

  • C/C++ 赋值表达式注意事项
    在C/C++中,赋值表达式是基础且关键的一部分,它用于给变量赋值。理解和正确使用赋值表达式对于编写有效、可维护的代码至关重要。以下是一些关于C/C++赋值表达式的注意事项:赋值操作符:在C/C++中,赋值是通过赋值操作符=完成的。这意味着将右侧的值或表达式的结果赋给左侧的变......
  • C#的多线程UI窗体控件显示方案 - 开源研究系列文章
          上次编写了《LUAgent服务器端工具》这个应用,然后里面需要新启动一个线程去对文件进行上传到FTP服务器,但是新线程里无法对应用主线程UI的内容进行更改,所以就需要在线程里设置主UI线程里控件信息的方法,于是就有了此博文。此文记录的是一种高级用法。      为了......
  • C#、C++和C的不同之处
    目录什么是C语言?什么是C++?什么是C#?主要不同C与C++C++与C#C与C#什么是C语言?我们先从C语言(Cprogramminglanguage)开始,因为它是三种语言中资格最老、使用最广的一种。丹尼斯·里奇(DennisRitchie)于1972年发明了它,然后于1978年出版。里奇最开始的设计初衷是想要开发新版本的Unix......
  • C++中的cerr和clog
    标准错误流(cerr)预定义的对象cerr是iostream类的一个实例。cerr对象附属到标准错误设备,通常也是显示屏,但是cerr对象是非缓冲的,且每个流插入到cerr都会立即输出。cerr也是与流插入运算符<<结合使用的,如下所示:和cout用法一样不过区别就在是否缓冲的问题。cerr是不缓冲的有什么......
  • 11.优化算法之栈
    1.删除字符串中的所有相邻重复项可以用数组模拟栈结构 classSolution{publicStringremoveDuplicates(Strings){if(s.length()<=1){returns;}StringBufferret=newStringBuffer();for(inti=0;i<s......
  • C++文件输入输出
    参考博文:https://blog.csdn.net/houbincarson/article/details/136327765/*文件输入输出fstream有三个文件流类:std::ifstream:用于从文件中读取数据的输入流对象。std::ofstream:用于向文件中写入数据的输出流对象。std::fstream:用于读写文件的输入输出流对象。*/#include<f......
  • 2024华为OD机试真题- 电脑病毒感染-(C++/Python)-C卷D卷-200分
     2024华为OD机试题库-(C卷+D卷)-(JAVA、Python、C++)      题目描述一个局域网内有很多台电脑,分别标注为0~N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。其中网络内一台电脑被病毒感染,求其感染网络内所有的电脑最少需要多长时间。......
  • C++(函数指针)
    目录基本语法示例常见用途注意事项函数指针是指向函数的指针,它保存了函数的地址,可以通过它调用指向的函数。函数指针在C++中具有多种用途,例如回调函数、动态函数调用以及实现多态等。基本语法函数指针的声明语法如下:返回类型(*指针名)(参数列表);示例声明和定义一个函数......
  • 11、 Django-模型基础-models-ORM框架-管理器对象
     #概述django根据属性的类型确定以下信息当前选择的数据库支持字段的类型渲染管理表单时使用的默认htm1控件在管理站点最低限度的验证django会为表增加自动增长的主键列,每个模型只能有一个主键列,如果使用选项设置某属性为主键列后则django不会再生成默认的主键列#属性命......
  • C++中的引用(Reference)
    1.引用(Reference)在C++中,引用(Reference)是一个变量的别名.它允许你通过不同的名字访问同一个变量.与指针不同,引用在定义时必须被初始化,并且一旦绑定到某个变量,之后不能更改引用的绑定对象.引用的语法引用(Reference)是C++中的一种重要特性,提供了对现有变量的另一种名称或别......