C++在Linux中如何实现多线程编程
C++在Linux中如何实现多线程编程

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
在Linux环境下为C++程序引入并发能力,主要有两条经典路径:历史悠久的POSIX线程(pthread)库,以及现代C++标准(C++11及以上)自带的线程库。两者各有适用场景,但核心目标一致——高效地创建和管理线程。
开始之前,有个小前提需要确认:你的编译器是否支持C++11或更高版本?如果答案是肯定的,那么恭喜,你可以直接使用语言内置的库,它在易用性和安全性上通常更胜一筹。当然,如果你的项目环境受限,使用经典的pthread库也完全可行,它几乎是Linux系统上线程操作的基石。
准备工作:包含正确的头文件
选择pthread库:你需要在代码中包含
这个头文件。它是系统级的线程接口,提供了丰富的底层控制功能。选择C++11线程库:则包含
即可。这是C++标准库的一部分,语法更符合C++的面向对象风格。
实战对比:两种创建线程的方式
光说不练假把式。下面我们通过两个功能完全相同的示例,来直观感受一下二者的区别。
使用pthread库的示例
先来看看传统的pthread写法。这种方式更接近C语言风格,需要手动管理线程属性和参数传递。
#include
#include
// 线程函数
void* thread_function(void* arg) {
int thread_id = *(static_cast(arg));
std::cout << “线程 ” << thread_id << “ 正在运行” << std::endl;
return nullptr;
}
int main() {
const int num_threads = 5;
pthread_t threads[num_threads];
int thread_ids[num_threads];
// 创建线程
for (int i = 0; i < num_threads; ++i) {
thread_ids[i] = i;
int result = pthread_create(&threads[i], nullptr, thread_function, &thread_ids[i]);
if (result != 0) {
std::cerr << “创建线程失败” << std::endl;
return 1;
}
}
// 等待线程结束
for (int i = 0; i < num_threads; ++i) {
pthread_join(threads[i], nullptr);
}
std::cout << “所有线程已完成” << std::endl;
return 0;
}
这段代码做了几件事:定义了一个线程函数,在main函数中创建了5个线程,并将线程ID作为参数传递过去,最后等待所有线程执行完毕。注意,参数需要通过指针进行传递和转换,这是pthread API的要求。
使用C++11线程库的示例
再来看看现代C++的写法。是不是感觉清爽了很多?
#include
#include
// 线程函数
void thread_function(int thread_id) {
std::cout << “线程 ” << thread_id << “ 正在运行” << std::endl;
}
int main() {
const int num_threads = 5;
std::thread threads[num_threads];
// 创建线程
for (int i = 0; i < num_threads; ++i) {
threads[i] = std::thread(thread_function, i);
}
// 等待线程结束
for (int i = 0; i < num_threads; ++i) {
threads[i].join();
}
std::cout << “所有线程已完成” << std::endl;
return 0;
}
对比之下,高下立判。C++11的版本省去了线程ID数组,参数传递直接而自然(无需指针转换),创建线程的std::thread构造函数也更加直观。这不仅仅是语法糖,更意味着更少的出错可能。
如何选择?
简单总结一下。两个示例都成功地创建了5个线程并执行了打印任务,但实现路径不同。
pthread库作为系统原生接口,功能强大且控制粒度细,在需要精细调整线程属性(如调度策略、栈大小)的场景下仍是首选。而C++11线程库则提供了更高级别的抽象和更符合现代C++习惯的语法,极大地简化了日常的多线程编程。
所以,对于大多数新的C++项目而言,除非有明确的兼容性或底层控制需求,否则直接采用C++11及以上的线程库会是更推荐的选择。它让开发者能更专注于业务逻辑,而非底层细节。
相关攻略
Linux XRender与其他图形库的集成方法 一 前置检查与环境准备 在着手进行XRender与其他图形库的集成前,充分的前置检查与准备工作至关重要。这如同建筑前的勘探,能有效规避后续的兼容性问题与性能瓶颈。 确认 X 服务器已启用 XRender 扩展:最便捷的验证方法是打开终端,执行命令 x
XRender 在 3D 渲染中的定位与边界 在图形渲染技术栈中,每个组件都有其明确的职责边界。XRender,作为 X Window System 的核心 2D 渲染扩展,其核心专长在于提供高质量的 2D 图形操作,包括抗锯齿、渐变填充、透明度处理以及图像合成。需要明确的是,它并非一个 3D 渲染
Linux Trigger:如何构建你的自动化“中枢神经” 在自动化运维和开发流程中,Linux Trigger 常常扮演着那个关键的“触发器”角色。但它的真正威力,往往在于如何与其他工具和服务编织成一张协同工作的网,从而构建出更复杂、更智能的自动化工作流。下面这张图,就为我们清晰地勾勒出了这种集成
C语言readdir函数文件路径处理详解 在C语言编程中,对文件系统进行目录遍历是常见的操作需求。readdir函数作为读取目录内容的核心接口,通常需要与opendir和closedir函数配合使用,形成一个完整的目录访问流程。然而,许多开发者在实际应用时容易忽略一个关键技术点:如何正确解析并拼接从
readdir函数中的文件类型判断 在C语言编程中,进行文件系统操作时,readdir函数是实现目录遍历的核心接口。该函数返回一个指向dirent结构体的指针,其中包含一个关键的成员变量——d_type。通过直接检查d_type的值,开发者能够高效、快速地识别出当前条目是普通文件、目录,还是其他特殊
热门专题
热门推荐
电陶炉清洁后出现白雾?别慌,这是正常现象 清洁完电陶炉,一开机,面板上却泛起一层白蒙蒙的雾气?先别急着担心是面板坏了。这其实是微晶玻璃表面残留的水渍或清洁剂成分,在受热时蒸发、散射光线所导致的正常物理现象。它并非面板老化、涂层脱落或材质损伤的信号,恰恰相反,这现象背后是行业通用的高品质材料——比如日
路由器信号最佳的摆放方式 想让家里的Wi-Fi信号满格、延迟稳定?秘诀其实就藏在路由器的摆放里。经过大量实测验证,最理想的摆放位置是房屋的几何中心、离地1 2到1 5米的开放高处,并且要严格远离金属物体、承重墙和大功率电器。这背后的原理,是Wi-Fi电磁波在2 4GHz和5GHz频段固有的传播特性:
白天离家时,海尔壁挂炉应设置为冬季模式下的“低温常开”状态 白天离家时,把壁挂炉完全关掉?这可能是很多人的习惯操作,但未必是最优解。更推荐的做法是,将海尔壁挂炉设置为冬季模式下的“低温常开”状态。这个设定听起来有点反直觉,其实背后是一套兼顾系统稳定、节能效果与居住舒适度的成熟逻辑——对于暖气片用户,
海尔壁挂炉推荐使用“舒适模式”实现自动温度调节 想让家里的壁挂炉自己“学会”调节温度吗?海尔壁挂炉的“舒适模式”就是为此而设计的。这个模式的核心在于“微调”和“预判”:它把水温控制的温差范围缩小到3–4℃,再配合变频技术实时响应室温变化,最终能把实际水温的波动稳稳地控制在±0 8℃以内。体感上的直接
苹果Pro静音后闹钟会响吗?一个被误解的“安全网” 相信不少苹果Pro用户都有过这样的疑惑:晚上把手机侧面的静音拨片一拨,世界瞬间清净。但转念一想,明天早上的闹钟还能准时响吗?答案是肯定的,而且会响得理直气壮。这可不是什么系统漏洞,恰恰相反,这是iOS为你筑起的一道“时间安全网”——静音开关管的是外





