Linux c++多线程/多进程1
#include <pthread.h>
使用的是一个动态库文件,编译的时候指定文件 -lpthread
在linux的情况下,线程的本质依旧是进程,因为历史遗留问题,没有线程的具体设置,所以就在进程这一最小的资源分配单位上搞出来了线程,作为最小的执行单位
win是真实的进程限制
进程有具体的地址空间,线程没有,所以线程更节省资源,不同的线程有自己的栈区和寄存器(用于存取临时变量),栈区是依附于进程的,线程共享代码区(存储代码的),堆区(溢出的资源),全局数据区(全局变量)。
这就是多线程需要锁的原因,多线程在实际调用资源的时候会调用共享区的资源,为了保证在调用时共享区资源不会改变,就需要锁。
每个进程对应一个虚拟地址空间,而每一个进程只能抢一个cpu时间片,而如果有多个线程,就会多次去抢cpu时间片
线程的上下文切换是要比进程快得多的,上下文切换就是任务保存和重加载的过程,因为线程的大部分资源时共享的,所以保存和重加载的时候是更快的
同时,这一说明了线程主要适用于相同资源的程序并行运行,如果并行的程序需要不同的资源,那就使用进程
线程的数目不是越多越好,一般如果复杂算法,线程=cpu核心数,如果是io之类的操作,线程=2cpu核心数就行,因为这种时候cpu压力较小,所以可以多加一些
在linux创建的是子线程,因为在开启一个程序之后会出现一个进程,如果在这个进程中再次创建线程,那这个进程就蜕化成为了主线程,如果主线程停止,那么其中的资源被释放,依靠这些资源的子线程也就被释放了
每个线程都有一个线程id pthread_t类型,底层是一个无符号长整数
pthread_t pthread_self(void),返回当前进程的id
pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg)
创建线程,id号,线程属性(一般默认),线程中函数指针(函数名默认为函数指针,这个函数是必须要的,是用来执行的任务)(void*是一个任意类型),传入参数(用于传入函数参数)
子线程创建出来之后就会执行他自己的函数,主线程在创建子线程完之后继续执行
主线程在创建出子线程之后要先sleep一下或者将子线程分离,防止主线程执行完了子线程还没搞定
线程退出函数,目的是让一个函数退出但是不影响其他的线程,主要适用于主线程,目的是让主线程退出后子线程依旧能够正常运行
void pthread_exit(void* retval),传出的实际是一个地址
线程回收函数
线程回收是用来主线程回收子线程资源,因为不同的线程用于同一个虚拟地址空间,如果子线程结束那其中的资源自动释放,这种时候就需要有主线程进行回收有用资源,在使用的时候默认是进入了阻塞,知道阻塞结束之后才会正常回收。
子线程释放的是栈区的资源,而主线程是释放内核区的资源,也就是内存管理,进程管理那些
int pthread_join(pthread_t thread, void **retval)
后面一个是双指针,用于指向实际传出结果的地址
子线程回收要先用pthread_exit结束,然后join就会接受到结果
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探