C++多线程编程详解

yizhihongxing

我会详细讲解C++多线程编程的攻略。对于多线程编程,一般分为以下几个步骤:

1. 包含头文件

要进行多线程编程,需要包含头文件<thread>

#include <thread>

2. 创建线程

使用std::thread类创建一个线程,并将需要执行的函数作为参数传入。

void my_func() {
    // 线程要执行的代码
}

std::thread my_thread(my_func);  // 创建线程并传入函数

3. 线程执行

创建好线程后,使用std::thread类的join()方法等待线程执行完成。

my_thread.join();  // 等待线程执行完成

4. 线程参数传递

可以通过向线程函数传递参数来进一步使用线程的能力。线程函数参数可以是任何类型的值或引用,包括C++对象。

void my_func(int arg1, double arg2, std::string arg3) {
    // 线程要执行的代码
}

int my_arg1 = 5;
double my_arg2 = 1.23;
std::string my_arg3 = "Hello";

std::thread my_thread(my_func, my_arg1, my_arg2, my_arg3);  // 传递参数创建线程

示例1:打印数字

下面是一个简单的示例,展示如何使用多线程并行打印数字。

#include <iostream>
#include <thread>

void print_num(int num) {
    std::cout << num << std::endl;
}

int main() {
    std::thread t1(print_num, 1);
    std::thread t2(print_num, 2);
    std::thread t3(print_num, 3);

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

    return 0;
}

示例2:并行计算

下面是一个示例,演示如何将计算任务分为多个线程并行计算,并将计算结果汇总。

#include <iostream>
#include <thread>
#include <vector>
#include <numeric>

void count_sum(std::vector<int>& data, int start, int end, int& result) {
    result = std::accumulate(data.begin() + start, data.begin() + end, 0);
}

int main() {
    std::vector<int> data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    const int thread_num = 4;
    std::vector<std::thread> threads;

    std::vector<int> results(thread_num);
    const int data_size = data.size();

    for(int i=0; i<thread_num; i++) {
        int start = i * (data_size / thread_num);
        int end = (i + 1) * (data_size / thread_num);

        if(i == thread_num-1) {
            end = data_size;
        }

        threads.emplace_back(count_sum, std::ref(data), start, end, std::ref(results[i]));
    }

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

    int sum = std::accumulate(results.begin(), results.end(), 0);  // 将每个线程计算结果汇总
    std::cout << "Sum of vector = " << sum << std::endl;

    return 0;
}

以上就是C++多线程编程的基本攻略及两个示例。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++多线程编程详解 - Python技术站

(0)
上一篇 2023年5月22日
下一篇 2023年5月22日

相关文章

  • C程序 通过创建一个函数来检查素数

    创建一个函数来检查素数是一个常见的C语言编程问题。下面是一个步骤指南和示例示范。 步骤指南 步骤如下: 定义函数的名称和返回类型。由于函数检查一个数字是否为素数,因此我们可以定义函数为 isPrime(),且函数返回类型为 int,因为我们需要返回0或1。 在函数内部定义一个整数 i 用于循环。我们需要从2到输入数字的平方根进行循环,判断输入数字是否能被整除…

    C 2023年5月9日
    00
  • 基于c++中的默认拷贝函数的使用详解

    基于C++中的默认拷贝函数的使用详解 在C++中,当我们定义了一个类,并对其进行实例化时,如果没有手动定义拷贝构造函数或拷贝赋值运算符,那么编译器会自动为该类提供默认的拷贝构造函数和拷贝赋值运算符。本文将详细讲解这两种默认拷贝函数的使用。 默认拷贝函数的定义 默认拷贝函数的定义如下: class MyClass { public: MyClass(const…

    C 2023年5月22日
    00
  • C语言基于EasyX绘制时钟

    下面是C语言基于EasyX绘制时钟的完整攻略: 准备工作 首先,需要安装EasyX图形库。EasyX是一个图形界面库,可以方便地在Windows平台上进行图形编程。EasyX官网提供了安装包以及一些基本的教程和案例,可以前往 https://easyx.cn/ 下载并安装。 绘制时钟的基本原理 绘制时钟需要用到EasyX封装的一些图形函数,包括绘制圆形、矩形…

    C 2023年5月23日
    00
  • 融会贯通C++智能指针教程

    下面我来详细讲解融会贯通C++智能指针教程的完整攻略。 一、什么是C++智能指针 C++智能指针(Smart Pointer)是一个封装了RAII(Resource Acquisition Is Initialization,资源获取即初始化)和指针语义的类模板,它会在对象生命结束时自动释放所持有的资源。智能指针可以有效地解决代码中因忘记释放资源而导致的内存…

    C 2023年5月22日
    00
  • C/C++语言中结构体的内存分配小例子

    下面是关于C/C++语言中结构体的内存分配小例子的完整攻略。 一、结构体的定义 定义结构体时,需要使用struct关键字。以下是一个结构体的示例代码: struct student{ int id; char name[30]; int age; }; 上述代码定义了一个名为student的结构体,其中包含三个成员变量:id、name和age。 二、结构体的…

    C 2023年5月23日
    00
  • C语言入门篇–学习选择,if,switch语句以及代码块

    C语言入门篇–学习选择,if,switch语句以及代码块 在C语言中,选择结构是非常重要的程序控制结构之一,它允许程序员根据条件执行不同的代码块。在本篇文章中,我们将学习选择、if、switch语句以及代码块的使用方法。 选择 选择是一种程序控制结构,它允许程序员根据条件执行不同的代码块。在C语言中,有两种选择结构:if语句和switch语句。 if语句 …

    C 2023年5月23日
    00
  • 魔鬼鱼DR7-PLUS做工值得买吗?未来人类魔鬼鱼DR7-PLUS配置性能全面评测+拆解

    魔鬼鱼DR7-PLUS做工值得买吗? 魔鬼鱼DR7-PLUS是一款高性能台式电脑主机,其做工和性能非常出色,下面我们来详细地评测一下它的配置和性能。 配置 魔鬼鱼DR7-PLUS的配置如下: 处理器:Intel Core i9-11900K(3.5GHz) 显卡:NVIDIA GeForce RTX 3090 24GB 内存:32GB DDR4 3200MH…

    C 2023年5月24日
    00
  • Android SQLite详解及示例代码

    Android SQLite详解及示例代码 什么是Android SQLite SQLite是一个轻型的数据库库,它存储在设备的内部存储上,并提供了一些SQL接口用于读写数据。在Android开发中,SQLite是非常重要的一部分,它被广泛应用于Android应用的本地数据存储。 如何使用Android SQLite 1. 创建一个SQLite数据库 第一步…

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部