新闻详情

新闻详情

首页 / 资讯中心 / 详情

C++创建多线程的方法总结

发布时间:2026/10/1 17:35:23来源:尧图网络
C++创建多线程的方法总结
一、多线程预备知识多线程本质是将程序的运行拆分为部分每个线程都有自己的执行上下文包括它的程序计数器寄存器和栈并且它们独立地执行互不干扰。我们必须要明确的是多线程的实现依赖硬件条件多线程需要多核处理器。多核处理器可以同时执行多个线程因此多线程可以利用多核处理器的多个内核来实现更快的处理速度和更高的性能。通过使用多核处理器可以把多个线程并行执行从而实现更高的性能和更快的处理速度。比如说在图像处理应用中如果使用多核处理器可以把图像处理任务分成多个独立的部分并使用多个线程分别执行每个部分。每例如线程 1 可以处理图像的颜色校正线程 2 可以处理图像的缩放线程 3 可以处理图像的旋转等。由于每个线程都可以同时执行因此处理速度比单线程处理要快得多。需要注意的是在这种情况下还需要考虑线程间的同步和通信以确保线程之间的数据一致性。二、C11 std::thread2.1 创建线程123456789101112131415#include iostream#include threadvoidfoo(){std::cout Hello from thread std::endl;}intmain(){std::threadt1(foo);t1.join();return0;}在上面的代码中通过std::thread t1(foo)创建了一个新线程并在新线程中执行了函数foo。2.2 线程管理12345678910111213141516#include iostream#include threadvoidfoo(){std::cout Hello from thread std::endl;}intmain(){std::threadt1(foo);t1.join();t1.detach();return0;}在上面的代码中通过调用t1.join()可以等待线程t1结束并通过调用t1.detach()可以分离线程t1使线程在后台运行。std::thread::detach()方法是分离线程的方法通过调用detach()方法可以让线程在后台独立运行不需要等待线程结束即可返回。与调用join()方法不同分离的线程不受父线程的控制因此如果父线程结束分离的线程不会因此结束。请注意分离的线程一旦开始执行它将独立运行不受任何控制因此不能在父线程中等待它的结束或者通过其他方式获取其结果。如果需要等待线程结束请使用join()方法。分离线程的主要作用是让线程在后台独立运行不需要等待线程结束即可返回。这样可以在不需要等待线程结束的情况下在父线程中执行其他任务从而提高程序的效率。2.3 传递参数123456789101112131415#include iostream#include threadvoidfoo(intx){std::cout Hello from thread, x x std::endl;}intmain(){std::threadt1(foo, 10);t1.join();return0;}在上面的代码中通过在创建线程时传递参数10并在函数foo中读取参数实现了在线程中传递参数的功能。2.4 线程间通信2.4.1 使用共享变量和互斥量互斥锁12345678910111213141516171819202122232425262728#include iostream#include thread#include mutexintg_num 0;std::mutex g_num_mutex;voidprint_num() {while(true) {g_num_mutex.lock();if(g_num 100) {g_num_mutex.unlock();break;}std::cout Thread std::this_thread::get_id() : g_num std::endl;g_num_mutex.unlock();}}intmain() {std::threadt1(print_num);std::threadt2(print_num);t1.join();t2.join();return0;}我们定义了一个全局变量g_num两个线程分别运行print_num函数。print_num函数不断地对g_num变量进行读写操作并使用互斥量g_num_mutex对该变量进行加锁。这样可以确保在每次读写操作时不会有其他线程访问g_num变量。如果g_num的值已经大于等于100则表示线程退出。最后主线程调用join函数等待其他线程退出。2.4.2 使用共享内存12345678910111213141516171819202122232425262728#include iostream#include thread#include stringusingnamespacestd;string message;voidwrite_message(){message Hello World;}voidread_message(){cout message endl;}intmain(){threadt1(write_message);threadt2(read_message);t1.join();t2.join();return0;}2.5 其他线程相关信息std::thread::hardware_concurrency()返回当前系统支持的最大线程数。std::thread::native_handle()返回线程的原生句柄在不同的平台中可能不同。std::thread::joinable()判断线程是否可以被 join如果线程已经结束或者被分离则返回 false。std::thread::join()等待线程结束直到线程结束才返回。std::thread::detach()分离线程使线程可以在后台运行并且不需要等待其结束。std::thread::get_id()返回线程ID。三、boost多线程库官方文档Chapter 38. Thread 4.8.0 - 1.73.0Boost 库中的boost::thread类可以方便地创建和管理多线程。以下是一个使用 Boost 库中的boost::thread类创建多线程的简单示例12345678910111213141516#include iostream#include boost/thread.hppvoidworker_thread(){std::cout Worker thread is running std::endl;}intmain(){boost::threadworker(worker_thread);std::cout Main thread is running std::endl;worker.join();return0;}四、POSIX线程LinuxUnixC POSIX 线程pthread库可以帮助您在 C 中创建和管理多线程。下面是一个创建和启动一个新线程的示例代码123456789101112131415161718192021222324252627282930#include pthread.h#include iostreamvoid*thread_func(void*arg){std::cout Thread started with argument: *((int*)arg) std::endl;returnNULL;}intmain(){pthread_t thread_id;intarg 42;// 创建新线程intresult pthread_create(thread_id, NULL, thread_func, arg);if(result ! 0) {std::cerr Error: pthread_create() failed std::endl;return1;}// 等待线程结束result pthread_join(thread_id, NULL);if(result ! 0) {std::cerr Error: pthread_join() failed std::endl;return1;}return0;}这段代码中pthread_create函数用于创建一个新线程并启动它。第一个参数是一个指向线程 ID 的指针第二个参数指定了线程的属性通常为NULL第三个参数是线程函数的地址最后一个参数是传递给线程函数的参数。pthread_join函数等待线程结束第一个参数是线程 ID第二个参数是接收线程返回值的指针通常为NULL。五、 Windows线程库5.1 线程使用下面是使用Windows API创建线程并打印数字并获取重要的线程信息的代码示例123456789101112131415161718192021222324252627282930313233#include iostream#include Windows.hDWORDWINAPI ThreadFunction(LPVOIDlpParam){// 获取当前线程IDDWORDthreadId GetCurrentThreadId();std::cout Thread ID: threadId std::endl;// 获取线程传入的参数intthreadParam *(int*)lpParam;for(inti 0; i threadParam; i){std::cout i std::endl;}return0;}intmain(){intnum 10;// 创建线程HANDLEhThread CreateThread(NULL, 0, ThreadFunction, num, 0, NULL);// 等待线程结束WaitForSingleObject(hThread, INFINITE);// 关闭线程句柄CloseHandle(hThread);return0;}5.2 线程通信在 Windows API 中可以使用CreateThread函数创建线程以下是通过共享变量实现线程间通信的代码示例1234567891011121314151617181920212223242526272829303132333435363738394041#include Windows.h#include iostreamDWORDWINAPI ThreadFunction1(LPVOIDlpParam){int* sharedVariable (int*)lpParam;while(true){if(*sharedVariable 0){std::cout Thread 1: sharedVariable *sharedVariable std::endl;*sharedVariable 1;}}return0;}DWORDWINAPI ThreadFunction2(LPVOIDlpParam){int* sharedVariable (int*)lpParam;while(true){if(*sharedVariable 1){std::cout Thread 2: sharedVariable *sharedVariable std::endl;*sharedVariable 0;}}return0;}intmain(){intsharedVariable 0;HANDLEhThread1 CreateThread(NULL, 0, ThreadFunction1, sharedVariable, 0, NULL);HANDLEhThread2 CreateThread(NULL, 0, ThreadFunction2, sharedVariable, 0, NULL);WaitForMultipleObjects(2, hThread1, TRUE, INFINITE);CloseHandle(hThread1);CloseHandle(hThread2);return0;}在主函数中我们调用了CreateThread函数创建了两个线程将共享变量sharedVariable的地址作为参数传入。线程 1 和线程 2 都通过判断共享变量的值来实现通信它们每当共享变量的值变化时都会输出当前的值。在这个例子中WaitForMultipleObjects函数将等待两个线程hThread1和hThread2完成并且要求等待所有事件对象完成因此参数bWaitAll的值为TRUE。并且dwMilliseconds的值为INFINITE所以等待时间是无限的。
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

小白也能看懂的大模型新宠Step 3.5 Flash,高效智能体开发必备 2026/10/1 19:05:44

小白也能看懂的大模型新宠Step 3.5 Flash,高效智能体开发必备

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
华为云AgentArts实战:金融信贷AI智能体从零搭建与落地指南 2026/10/1 19:05:44

华为云AgentArts实战:金融信贷AI智能体从零搭建与落地指南

金融信贷这个行当,过去十年我基本都在跟风控系统和信贷流程打交道。早些年做规则引擎,后来做评分卡,再后来搞机器学习模型,每一步都是在解决“怎么让机器更懂业务”这个问题。但真正让我觉得门槛被踏平的,是最近两年AI…

阅读更多 →
基于RFID技术的国有资产管理系统Java后台开发实战:从读写器对接到盘点避坑 2026/10/1 19:05:44

基于RFID技术的国有资产管理系统Java后台开发实战:从读写器对接到盘点避坑

简介:这份资源是面向Java方向本科毕业设计的后台项目源码,主题为基于RFID技术的国有资产管理系统,适合正在准备毕设、需要完整可运行工程参考的计算机专业学生,也可供想了解RFID资产盘点、借还、报废等业务建模的开发者学习。压缩…

阅读更多 →
MiMo-V2.6全面解析:双版本选择、AA指数与部署实战 2026/10/1 19:05:44

MiMo-V2.6全面解析:双版本选择、AA指数与部署实战

MiMo-V2.6 的发布消息,这两天在开源模型圈子里讨论度确实不低。这次小米一口气放出 Pro 和 Flash 两个版本,价格维持原样,同时在 AA 指数上的排名超过了 Kimi K3 和 GLM-5.3,直接成为开源阵营里排名最高的模型。这个信息量其实挺大…

阅读更多 →
Docker 入门实战:从安装到 Compose 多容器部署与排错指南 2026/10/1 19:05:44

Docker 入门实战:从安装到 Compose 多容器部署与排错指南

简介:《Docker基础入门指南》面向具备一定计算机基础、希望从零掌握容器技术的开发者与运维初学者,帮助解决环境搭建繁琐、部署流程不统一等入门痛点。资源包共1个PDF文件,约696KB,内容以图文与命令示例为主,便于随时查…

阅读更多 →
2026年32位Win7玩Steam老游戏:离线模式、TLS优化与系统配置全指南 2026/10/1 19:05:38

2026年32位Win7玩Steam老游戏:离线模式、TLS优化与系统配置全指南

先说结论:2026年的32位Win7,已经没法像十年前那样痛快地刷Steam商店、逛社区、同步云存档了。但如果你的需求只是“双击桌面图标,进游戏,能玩”,而且玩的以老游戏为主,这条路依然走得通。下面这份折腾记录&…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉