当前位置: 首页 > news >正文

浅谈C++之多线程实现

一、基本介绍

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

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

二、实现方式

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

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

#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::futurestd::async可以用来异步地获取线程的执行结果。

#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)等。

#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>

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

#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引入了协程,提供了一种更高级的异步编程模型。

#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之前实现多线程的方法。

#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)。

// 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;
}


http://www.mrgr.cn/news/34817.html

相关文章:

  • 软考高级:企业信息化-数据挖掘中的上卷和下钻、旋转分析
  • tortoies-orm 一对一、一对多和多对多关系实现
  • 设计模式之中介者
  • k8s知识汇编
  • 前端导出excel表格
  • 分布式难题-三座大山NPC
  • 【JAVA-数据结构】初识集合框架
  • vue2和vue3页面加自定义水印(组件化)
  • 828华为云征文 | 华为云Flexusx与OwnCloud的完美融合,打造高效云端办公环境
  • Centos安装helm
  • 玩手机数据集 8201张玩手机的照片,有对应的xml和txt文件,可以用于yolo训练
  • SaaS 软件转型计划
  • 【python】requests 库 源码解读、参数解读
  • 音视频入门基础:FLV专题(3)——FLV header简介
  • <<编码>> 第 17 章 自动操作(2)--自动加法器 示例电路
  • AI学习指南深度学习篇- Adadelta在深度学习中的应用
  • 两款强大的SSL证书自动化工具:Certimate vs Certd
  • java并发之并发理论
  • 输电线塔目标检测数据集yolo格式该数据集包括2644张输电线塔高清图像,该数据集已经过yolo格式标注,具有完整的txt标注文件和yaml配置文件。
  • GPT和Copilot联手,AI编程进入新纪元