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

【Linux】创建线程

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

文章目录

一、为什么需要线程?

创建线程

示例:计算斐波恩夕法


一、为什么需要线程?

在多核处理器的计算机上,线程可以充分利用 CPU 资源,提高程序的执行效率。线程是轻量级的进程,创建和销毁的开销远小于进程,使得线程成为并发编程的首选。

创建线程

在 Linux 中,使用 pthread 库创建线程的基本步骤如下:

  1. 包含头文件

#include <pthread.h>
  1. 定义线程函数: 线程函数是线程执行的入口点,它必须符合特定的函数签名。

void* thread_function(void* arg) {// 线程执行的代码return nullptr;
}
  1. 创建线程: 使用 pthread_create 函数创建线程,并将线程函数作为参数传递。

 

pthread_t thread;
int result = pthread_create(&thread, nullptr, thread_function, nullptr);
if (result != 0) {// 处理错误
}
  1. 等待线程结束: 使用 pthread_join 函数等待线程结束。

 

void* ret = nullptr;
pthread_join(thread, &ret);
  1. 销毁线程: 线程结束时,使用 pthread_exit 函数退出线程。

 

pthread_exit(nullptr);
示例:计算斐波恩夕法

下面是一个使用线程计算斐波那契数列的示例,展示了如何创建多个线程来并行计算。

 

#include <iostream>
#include <pthread.h>
#include <vector>void* calculate_fibonacci(int n) {std::cout << n << " = " " << n << std::endl;
}class Thread {
public:std: _func, const std::string &name = "None"): _name(name), _func(func), _is_running(false){}static void*start_routine(void *args) {Thread *self = static_cast<Thread *>(args);self->_is_running = true;self->_lwpid = get_lwp_id();self->_func();pthread_exit((void *)0);}void Start() {int n = pthread_create(&_tid, nullptr, start_routine, this);if (n == 0) {std::cout << "run thread success\n" << std::endl;}}void Join() {if (!_is_running){return;}int n = pthread_join(_tid, nullptr);if (n == 0) {std::cout << "pthread_join success" << std::endl;}}~Thread() {}private:bool _is_running;pthread_t _tid;pid_t _lwpid;std::string _name;func_t _func;
};using func_t = std::function<void()>;int main() {std::vector<int> numbers = {0, 1, 1, 2, 3, 5, 8, 13};Thread threads;for (auto num : numbers) {Thread t([= calculate, "Thread " + std::to_string(num)]);t.Start();threads.push_back(std::move(t));}for (auto& t : threads) {t.Join();}return 0;
}

http://www.xdnf.cn/news/19365.html

相关文章:

  • 基于K8s部署Redis高可用
  • mit6.031软件构造 笔记 Testing
  • Redis进阶(上)
  • Win11输入法异常解决方案
  • 智能合约安全全解析:常见漏洞、真实案例与防范实践
  • 机器视觉学习-day14-绘制图像轮廓
  • 【机器学习基础】监督学习算法的现代理解:从经典方法到无人驾驶与生成式AI的实践应用
  • [光学原理与应用-353]:ZEMAX - 设置 - 可视化工具:2D视图、3D视图、实体模型三者的区别,以及如何设置光线的数量
  • 财务的三张报表:现金流表、利润表、资产负债表
  • Spring/Spring MVC/iBATIS 应用 HTTP 到 HTTPS 迁移技术方案
  • 基于i.MX6ULL的RAM Disk驱动开发
  • 【开题答辩全过程】以 付费自习室系统小程序为例,包含答辩的问题和答案
  • 【编号186】中国劳动统计年鉴(1991-2023)
  • kafka服务端架构总览
  • 【C++】显示与隐式加载dll的使用与区别
  • 技术框架之RPC
  • 【系统分析师】高分论文:论信息系统的安全与保密设计
  • c++ 线程局部存储(Thread-Local Storage,TLS)
  • 当服务器报警响起:CPU、内存、磁盘使用率飙升的诊断与处置
  • 基于单片机智能鞋柜/智能鞋橱/智能鞋盒
  • C++项目的Makefile案例解析
  • Python基础之元组列表集合字典
  • Python与Rust语法对比详解:从入门到精通
  • C++顺序嵌套回调函数
  • 飞牛NAS上部署Markdown文稿编辑器,阅读.md文件同时还可以跨平台访问!
  • Qt精华版打包教程,支持windows和Linux,每种平台支持2种方案
  • 电感值过大过小会影响什么
  • AI基础学习周报十一
  • 艾体宝案例 | 数据驱动破局:DOMO 如何重塑宠物零售门店的生存法则
  • HarmonyOS 应用开发:基于API 12+的现代化实践