ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Linux进程与线程(2)

Linux进程与线程(2) 一、什么是线程线程被称作轻量级进程是完成任务创建、调度、消亡的执行单元。进程内部可以存在多个线程所有线程共享进程的资源每个线程拥有自己独立栈空间。二、进程与线程核心区别进程操作系统资源分配最小单元每个进程独占0‑4G虚拟地址空间包含文本段、数据段、系统数据段进程之间资源完全隔离。线程操作系统任务调度最小单元线程运行在进程的地址空间之内。独有栈空间线程内部局部变量每个线程互不干扰。共享堆区、全局变量、静态变量、字符串常量、代码文本区同一个进程的全部线程共用。重点局部变量在线程栈线程私有全局、static全部共享多线程同时修改会产生竞争问题。三、线程创建特性每个线程自带独立栈空间Linux默认大小8MB。创建出来的多个线程宏观并行运行微观串行由操作系统内核完成调度。四、线程消亡与僵尸线程线程执行结束之后必须使用 pthread_join 回收线程资源。如果不回收会产生僵尸线程残留的线程栈空间得不到释放造成内存泄漏。类比记忆进程用 wait/waitpid 回收子进程线程对应 pthread_join 回收。五、线程常用接口对照表进程API 对应线程APIfork pthread_createexit pthread_exitwait pthread_join1.pthread_create 创建线程int pthread_create(pthread_t *thread, const pthread_attr_t *attr,void *(*start_routine) (void *), void *arg);thread 输出参数存放新线程ID。attr 线程属性栈大小、优先级等传NULL使用默认属性。start_routine 线程函数指针线程启动后执行这个函数。arg 传给线程函数的参数只能是 void* 类型。返回值成功返回0失败返回错误码不设置errno不能用perror。注意传递整型数字给线程函数规范写法 (void *)(long)num 接收时 int val (int)(long)arg 适配64位系统。2.pthread_exit 退出线程void pthread_exit(void *retval);功能终止当前线程不会影响同进程其他线程。retval 线程退出状态这个值可以被 pthread_join 获取。注意不要在线程函数内部使用 exit() exit 会直接把整个进程全部结束所有线程一同销毁。3.pthread_join 阻塞回收线程int pthread_join(pthread_t thread, void **retval);功能阻塞等待指定线程执行完毕回收线程栈资源。thread 要等待回收的线程ID。retval 接收线程 pthread_exit 传出的状态不需要可以传NULL。返回值成功返回0失败返回错误码。⚠️重要坑点不能对未创建、无效的tid执行 pthread_join 程序直接崩溃。必须保证线程已经创建才允许调用join工程中一般搭配标记数组判断。调用之后主线程会原地阻塞一直等到目标线程运行结束代码才继续向下执行。六、实操代码要点总结多线程作业中需要数组标记哪些线程已经创建避免重复 pthread_create 。返回值判断下标一一对应创建几号线程就判断对应下标的返回值。数组循环注意边界数组大小N循环条件 i N 。键盘 getchar 读取按键需要过滤换行符 \n 防止回车被当成输入。编译链接必须增加 -pthread 否则报函数未定义。pthread_join 会阻塞输入q退出之后主线程会等待所有子线程全部跑完程序才结束属于正常行为。重点总结进程管资源分配线程管任务调度。栈私有全局/静态/堆共享。pthread_create 创建 pthread_exit 退出线程 pthread_join 回收三一套组合。线程传数字参数必须经过long中间转换。join只回收真实创建成功的线程不要直接回收无效tid。编译选项 -pthread 。
返回列表