浅谈C++之多线程实现

一、基本介绍

传统的C++(C++11之前)中并没有引入线程这个概念,在C++11出来之前,如果我们想要在C++中实现多线程,需要借助操作系统平台提供的API,比如Linux的<pthread.h>,或者windows下的<windows.h> 。

C++11提供了语言层面上的多线程,包含在头文件<thread>中。它解决了跨平台的问题,提供了管理线程、保护共享数据、线程间同步操作、原子操作等类。

二、实现方式

C++11标准库中的<thread>库:

C++11引入了对多线程的原生支持,可以通过std::thread类来创建和管理线程。

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

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

int main() {
    std::thread t(hello);
    t.join();
    return 0;
}

C++11标准库中的<future>库:

std::future和std::async可以用来异步地获取线程的执行结果。

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

int compute() {
    return 42;
}

int main() {
    std::future<int> result = std::async(std::launch::async, compute);
    std::cout << "The result is " << result.get() << std::endl;
    return 0;
}

C++11标准库中的<mutex>库:

用于线程同步,包括互斥锁(std::mutex)、递归锁(std::recursive_mutex)、时间锁(std::timed_mutex)、共享锁(std::shared_mutex)等。

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

std::mutex mtx;
int counter = 0;

void increment() {
    std::lock_guard<std::mutex> lock(mtx);
    ++counter;
}

int main() {
    std::thread t1(increment);
    std::thread t2(increment);
    t1.join();
    t2.join();
    std::cout << "Counter: " << counter << std::endl;
    return 0;
}

C++11标准库中的<condition_variable>库:

用于线程间的同步,允许一个或多个线程等待特定条件的发生。

cpp 复制代码
#include <iostream>
#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];
    // 启动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();
}

C++20中的协程:

C++20引入了协程,提供了一种更高级的异步编程模型。

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

generator<int> GetNumbers() {
    for (int i = 0; i < 5; ++i) {
        std::this_thread::sleep_for(std::chrono::seconds(1));
        co_yield i;
    }
}

int main() {
    for (auto n : GetNumbers()) {
        std::cout << n << std::endl;
    }
    return 0;
}

使用第三方库:

如Boost库中的线程库(boost::thread),提供了在C++11之前实现多线程的方法。

cpp 复制代码
#include <boost/thread.hpp>
#include <iostream>

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

int main() {
    boost::thread t(hello);
    t.join();
    return 0;
}

操作系统级别的线程库:

如Windows的WinAPI中的线程函数(CreateThread)或POSIX线程(pthreads)。

cpp 复制代码
// POSIX threads example
#include <pthread.h>
#include <iostream>

void* hello(void* arg) {
    std::cout << "Hello from POSIX thread" << std::endl;
    return NULL;
}

int main() {
    pthread_t thread;
    pthread_create(&thread, NULL, hello, NULL);
    pthread_join(thread, NULL);
    return 0;
}
相关推荐
第九序言T2 小时前
Python 数据处理进阶(十八)批量处理同结构文件:一个文件夹一次跑完
开发语言·python·自动化·pandas·数据处理
Sakura_j_h_3 小时前
EasyEDA PCB 快速设计Skills
c++·python·github
龙亘川3 小时前
构建城市公共安全数字底座:亘川智城智慧安防系统全维度解读
java·大数据·开发语言·人工智能·信息可视化
程序喵大人3 小时前
【C++入门】内存模型与资源管理 - 09 shared_ptr 和 weak_ptr 解决共享,也带来代价
开发语言·c++·资源管理·智能指针·内存模型
Raas1004 小时前
AI网关部署方案?从部署到上线全流程
java·开发语言·人工智能·gateway·ai网关·企业级ai网关·企业级ai产品
专注仿真5 小时前
线性回归和逻辑回归算法详解
开发语言·人工智能·python·大模型训练·控制算法
jimy15 小时前
C++ 中的 `T&&`:右值引用与转发引用
开发语言·c++
呆呆虫126 小时前
用 orjson 加速 SerpBase 响应解析:基准对比与注意事项
开发语言·php
心疼你的一切6 小时前
Python自动发邮件实战定时发报表
大数据·开发语言·python
Wang's Blog7 小时前
Java 项目实战:交友项目 - 用户体系集成总结
java·开发语言·交友