白骑士的C++教学高级篇 3.2 多线程与并发

系列目录

上一篇:白骑士的C++教学高级篇 3.1 文件操作

        随着计算机硬件的发展,现代计算机通常配备了多核处理器,为并发编程提供了硬件基础。C++11引入了一组强大的多线程库,使得开发多线程应用程序变得更加容易和安全。本篇内容将详细介绍C++11的多线程基础、线程管理和同步机制(互斥量与条件变量),帮助掌握C++中的多线程编程技术。

C++11多线程基础

        C++11标准库引入了多线程支持,提供了 ‘std::thread‘ 类用于创建和管理线程。使用 ‘std::thread‘ 类可以轻松地创建新线程并在其中执行代码。

创建线程

        创建线程最基本的方式是将一个函数传递给 ‘std::thread‘ 构造函数。下面是一个简单的示例,演示了如何创建和启动一个线程:

#include <iostream>
#include <thread>


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


int main() {
    std::thread t(printMessage);

    // 等待线程完成
    t.join();

    return 0;
}

        在这段代码中,我们定义了一个名为 ‘printMessage‘ 的函数,并将其传递给 ‘std::thread‘ 构造函数来创建线程。使用 ‘t.join()‘ 方法等待线程完成执行。

传递参数

        可以通过构造函数将参数传递给线程函数,例如:

#include <iostream>
#include <thread>


void printMessage(const std::string& message) {
    std::cout << message << std::endl;
}


int main() {
    std::string msg = "Hello from thread with parameters!";
    std::thread t(printMessage, msg);

    t.join();

    return 0;
}

        在这段代码中,我们将一个字符串参数传递给 ‘printMessage‘ 函数,并在线程中打印该消息。

线程管理

        线程管理包括线程的创建、同步和销毁。C++11标准库提供了多种工具来帮助管理线程。

分离线程

        可以使用 ‘detach()‘ 方法将线程与主线程分离,允许线程在后台运行,例如:

#include <iostream>
#include <thread>


void backgroundTask() {
    std::this_thread::sleep_for(std::chrono::seconds(2));
    std::cout << "Background task completed." << std::endl;
}


int main() {
    std::thread t(backgroundTask);

    t.detach();

    std::cout << "Main thread continues to run..." << std::endl;
    std::this_thread::sleep_for(std::chrono::seconds(3));

    return 0;
}

        在这段代码中,我们使用 ‘detach()‘ 方法分离线程,使其在后台运行,而主线程继续执行。

线程同步

        线程同步是确保多个线程安全地访问共享资源的关键。C++11提供了多种同步机制,如互斥量(mutex)和条件变量(condition variable)。

互斥量与条件变量

        互斥量和条件变量是同步多个线程访问共享资源的基本工具。

互斥量

        互斥量(mutex)用于保护共享资源,确保同一时间只有一个线程可以访问资源。C++11提供了 ‘std::mutex‘ 类来实现互斥量。

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


std::mutex mtx;


void printNumbers(int start, int end) {
    std::lock_guard<std::mutex> guard(mtx);

    for (int i = start; i <= end; ++i) {
        std::cout << i << " ";
    }
    std::cout << std::endl;
}


int main() {
    std::thread t1(printNumbers, 1, 5);
    std::thread t2(printNumbers, 6, 10);

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

    return 0;
}

        在这段代码中,我们使用 ‘std::mutex‘ 保护共享资源,并使用 ‘std::lock_guard‘ 自动管理互斥量的锁定和解锁。

条件变量

        条件变量(condition variable)用于在线程之间同步事件。C++11提供了 ‘std::condition_variable‘ 类来实现条件变量,例如:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>


std::mutex mtx;
std::condition_variable cv;


bool ready = false;


void printNumbers(int id) {
    std::unique_lock<std::mutex> lock(mtx);

    cv.wait(lock, [] { return ready; });

    std::cout << "Thread " << id << " is running." << std::endl;
}


void setReady() {
    std::unique_lock<std::mutex> lock(mtx);

    ready = true;

    cv.notify_all();
}


int main() {
    std::thread t1(printNumbers, 1);
    std::thread t2(printNumbers, 2);
    std::this_thread::sleep_for(std::chrono::seconds(1));

    setReady();

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

    return 0;
}

        在这段代码中,我们使用 ‘std::condition_variable‘ 在线程之间同步事件。‘cv.wait(lock, [] { return ready; })‘ 用于等待条件满足,而 ‘cv.notify_all()‘ 用于通知所有等待线程条件已满足。

总结

        多线程与并发是C++编程中的重要概念,通过合理使用多线程技术,可以显著提高程序的性能和响应速度。C++11引入了一组强大的多线程库,使得多线程编程变得更加容易和安全。本篇内容详细介绍了C++11多线程基础、线程管理以及同步机制(互斥量与条件变量),希望通过这些内容,你能更好地掌握C++多线程编程技术,为编写高效、可靠的并发程序打下坚实的基础。

下一篇:白骑士的C++教学高级篇 3.3 内存管理​​​​​​​

相关推荐

  1. 骑士C++教学高级 3.2 线并发

    2024-07-20 03:38:01       20 阅读
  2. 骑士C语言教学高级 3.4 C语言中算法

    2024-07-20 03:38:01       21 阅读
  3. 骑士C++教学附加 5.2 代码规范最佳实践

    2024-07-20 03:38:01       15 阅读
  4. 骑士C++教学基础 1.3 控制流

    2024-07-20 03:38:01       22 阅读
  5. 骑士C++教学基础 1.5 数据结构

    2024-07-20 03:38:01       18 阅读
  6. 骑士C++教学进阶 2.3 模板

    2024-07-20 03:38:01       27 阅读
  7. 骑士PyCharm教学基础 1.3 调试运行

    2024-07-20 03:38:01       15 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-07-20 03:38:01       49 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-07-20 03:38:01       53 阅读
  3. 在Django里面运行非项目文件

    2024-07-20 03:38:01       42 阅读
  4. Python语言-面向对象

    2024-07-20 03:38:01       53 阅读

热门阅读

  1. gpg-agent

    2024-07-20 03:38:01       16 阅读
  2. 举一个产生Redis分布式锁死锁的场景。

    2024-07-20 03:38:01       10 阅读
  3. 蒙特卡洛模拟

    2024-07-20 03:38:01       13 阅读
  4. 关于Flutter的build

    2024-07-20 03:38:01       14 阅读
  5. codeforces错题

    2024-07-20 03:38:01       18 阅读
  6. 如何基于 Apache SeaTunnel 同步数据到 Iceberg

    2024-07-20 03:38:01       18 阅读
  7. # Vue.js 3: 探索响应式原理与组合式 API

    2024-07-20 03:38:01       15 阅读
  8. 聚类标签的艺术:Scikit-Learn中的转换技术

    2024-07-20 03:38:01       17 阅读