主进程 主线程和子线程 三者退出的关系

(1)在主线程和子线程中getpid()得到的进程pid是一样的,pthread_self()得到的线程号不一样。
(2)main()中,return 0 或者exit(0)退出主进程后,主函数创建的子线程都会被终止。在子线程处理函数中return NULL相当于调用pthread_exit(NULL)
(3)当主线程在子线程终止之前调用pthread_exit()时,此时只是线程结束主进程并未退出,因此子线程不会退出。(在main线程中调用pthread_exit会起到只让main线程退出,但是保留进程资源,供其他由main创建的线程使用,直至所有线程都结束,最后一个线程终止后,主进程将以退出状态0退出(主线程pthread_exit()后面的代码不会被执行到)。但在其他线程中pthread_exit不会有这种效果)
(4)在创建的新线程B中再次创建新线程C,那么如果B先退出,那么C将会继续执行而不会退出。

总结:一个线程的退出不会影响另外一个线程。但是进程结束,所有线程也就结束了,所有资源会被回收。

参考文献:https://blog.youkuaiyun.com/xiajun07061225/article/details/8976850?spm=1001.2101.3001.6650.2&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-8976850-blog-116828478.pc_relevant_multi_platform_whitelistv1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7Edefault-2-8976850-blog-116828478.pc_relevant_multi_platform_whitelistv1&utm_relevant_index=4

### 多线程与多进程的概念 多线程与多进程是两种实现并发编程的方式。其中,**多线程**是指在一个进程中创建多个线程来并行完成任务[^3]。而**多进程**则是指通过启动多个独立的进程来实现并发操作[^4]。 #### 主要概念对比 - **定义**: 进程是操作系统中资源分配的基本单位,它拥有独立的内存空间其他系统资源。线程是进程中的一个实体,它是CPU调度分派的基本单位,属于同一个进程的所有线程共享该进程的内存空间资源。 - **资源共享**: 同一进程内的所有线程共享相同的地址空间、文件描述符以及其他资源,但每个线程有自己独立的栈区。不同进程之间则不共享这些资源,除非显式地使用某种机制(如管道或共享内存)来进行数据交换。 --- ### 多线程与多进程的主要区别 以下是两者之间的几个核心差异: 1. **资源开销**: 创建一个新的进程通常会消耗更多的系统资源,因为需要为其分配新的虚拟地址空间及其他资源。相比之下,创建新线程的成本较低,因为它只需要初始化少量的数据结构即可运行在现有进程上下文中。 2. **通信成本**: 线程间可以直接访问彼此的全局变量或者对象实例,因此其间的通讯非常高效。然而跨进程通信往往依赖于特定的技术手段比如消息队列、套接字等,这增加了复杂性延迟时间。 3. **安全性与隔离性**: 如果某个线程崩溃,则可能影响整个进程的安全稳定性;而对于单独存在的各个子进程而言,即使其中一个发生错误也不会波及到其他正常工作的兄弟姐妹们那里去。 4. **GIL 的限制 (仅限 Python)**: 在 CPython 解释器里存在全局解释锁(Global Interpreter Lock),这意味着即便是在支持真正意义上的硬件级并行计算环境之下,纯 python 编写的代码也无法完全发挥 CPU 多核优势——除了借助第三方库绕过 GIL 或者采用 multiprocessing 模块之外的方法外[^1]。 --- ### 应用场景分析 #### 多线程适用场合 当应用程序主要是 I/O 密集型工作负载时(例如网络请求等待响应), 使用多线程能够显著提升性能, 因为在这种情况下大部分时候都是处于阻塞状态而非实际运算当中; 此外对于那些不需要太多考虑同步问题的小规模项目来说也是不错的选择之一. 示例代码如下所示: ```python import threading def worker(): """模拟耗时I/O操作""" print(f"{threading.current_thread().name} 开始") import time time.sleep(2) print(f"{threading.current_thread().name} 结束") threads = [] for i in range(5): t = threading.Thread(target=worker) threads.append(t) t.start() for t in threads: t.join() print("主线程结束") ``` #### 多进程适合情况 如果目标函数涉及大量数值计算或者其他类型的 CPU 密集型任务的话那么就应该优先选用 multi-processing 来代替 multi-threading , 原因前面已经提到过了即由于 GIL 存在使得后者无法充分利用现代计算机上的多核特性从而降低整体吞吐量表现.[^1] 下面给出一段简单的例子展示如何利用 `multiprocessing` 实现类似的逻辑功能. ```python from multiprocessing import Process def worker(): """模拟CPU密集型任务""" name = f"Process-{os.getpid()}" print(f"{name} 开始") sum(i * i for i in range(10**7)) print(f"{name} 结束") processes = [] for _ in range(5): p = Process(target=worker) processes.append(p) p.start() for p in processes: p.join() print("主进程结束") ``` --- ### 并发编程注意事项 无论选择哪种方式都需要特别注意一些潜在的风险因素诸如死锁条件形成的可能性以及竞态条件的发生几率等等这些问题如果不妥善解决就可能导致程序行为不可预测甚至崩溃退出等情况出现所以建议开发者始终遵循最佳实践指南并且尽可能简化设计减少不必要的交互次数以此达到既定目的的同时还能保持较高的可靠程度.[^2] ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值