浅谈C++之线程管理

一、基本介绍

C++11 提供了强大的多线程支持,涵盖了线程的创建、同步、共享数据管理等,极大简化了多线程编程的复杂性。

  • 线程:一个程序执行流的最小单位。每个线程都有自己的程序计数器、栈、寄存器等。
  • 多线程:程序可以同时执行多个任务,提高了程序的并发能力。
  • 并行与并发:并行是多个线程在多个处理器上同时运行;并发是多个线程在同一处理器上通过时间片轮转方式运行。

二、关键概念和示例

1. 包含头文件

首先,你需要包含头文件<thread>来使用线程库。

cpp 复制代码
#include <thread>

2. 创建线程

使用std::thread类来创建线程。你可以将一个函数或对象作为参数传递给std::thread的构造函数,这个函数或对象将在新线程中执行。

cpp 复制代码
#include <iostream>
#include <thread>

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

int main() {
    std::thread t(hello);
    t.join();  // 等待线程t完成
    return 0;
}

3. 传递参数给线程

你可以将参数传递给线程函数。

cpp 复制代码
#include <iostream>
#include <thread>

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

int main() {
    std::string message = "Hello from another thread!";
    std::thread t(print_message, message);
    t.join();
    return 0;
}

4. 线程的生命周期

  • join(): 阻塞调用线程,直到被join的线程完成执行。
  • detach(): 允许线程独立执行。主线程可以继续执行,而不需要等待子线程完成。
cpp 复制代码
std::thread t(hello);
t.detach();  // 线程t现在独立执行

5. 线程同步

使用互斥锁(std::mutex)和条件变量(std::condition_variable)来同步线程。

cpp 复制代码
#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);
    while (!ready) { cv.wait(lock); }
    std::cout << "Thread " << id << '\n';
}

void go() {
    std::unique_lock<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::cout << "10 threads ready to race...\n";
    go();
    for (auto& th : threads) th.join();
    return 0;
}

6. 线程局部存储

使用thread_local关键字定义线程局部存储,每个线程都有自己的变量副本。

cpp 复制代码
#include <iostream>
#include <thread>

thread_local int x = 0;

void increment() {
    x = x + 1;
    std::cout << "Thread " << std::this_thread::get_id() << " x = " << x << std::endl;
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);
    t1.join();
    t2.join();
    return 0;
}

7. 原子操作

使用std::atomic来处理简单的同步需求。

cpp 复制代码
#include <iostream>
#include <thread>
#include <atomic>

std::atomic<int> count(0);

void add() {
    for (int i = 0; i < 10000; ++i) {
        count += 1;
    }
}

int main() {
    std::thread t1(add);
    std::thread t2(add);
    t1.join();
    t2.join();
    std::cout << "Count: " << count << std::endl;
    return 0;
}
相关推荐
佛祖让我来巡山2 天前
深入理解JVM内存分配机制:大对象处理、年龄判定与空间担保
jvm·内存分配·大对象处理·空间担保·年龄判定
杨杨杨大侠2 天前
打开 JVM 黑匣子——走进 Java 字节码(一)
java·jvm·agent
J2K3 天前
JDK都25了,你还没用过ZGC?那真得补补课了
java·jvm·后端
侃侃_天下3 天前
最终的信号类
开发语言·c++·算法
Slaughter信仰3 天前
深入理解Java虚拟机:JVM高级特性与最佳实践(第3版)第十章知识点问答(10题)
java·jvm·数据库
echoarts3 天前
Rayon Rust中的数据并行库入门教程
开发语言·其他·算法·rust
Aomnitrix3 天前
知识管理新范式——cpolar+Wiki.js打造企业级分布式知识库
开发语言·javascript·分布式
每天回答3个问题3 天前
UE5C++编译遇到MSB3073
开发语言·c++·ue5
伍哥的传说3 天前
Vite Plugin PWA – 零配置构建现代渐进式Web应用
开发语言·前端·javascript·web app·pwa·service worker·workbox
小莞尔3 天前
【51单片机】【protues仿真】 基于51单片机八路抢答器系统
c语言·开发语言·单片机·嵌入式硬件·51单片机