行业知识
多线程面试题汇总
2026-11-13 07:54:26
来源:互联网转载
多线程面试题汇总
- 一、多线程
- 1、线程的生命周期
- 2、线程的创建(函数创建)
- 3、线程的创建(使用类)
- 4、守护线程
- 二、全局解释器锁
- 1、使用单线程实现累加到500000000
- 2、使用多线程实现累加到500000000
- 3、总结
- 三、线程安全
- 1、多线程之数据混乱问题
- 2、有了全局解释器锁(GIL)为什么还需要同步锁?
- 3、同步锁
- 3.1、加同步锁(with方法)
- 3.2、加同步锁(acquire方法和release方法)
- 四、锁
- 1、同步锁
- 2、递归同步锁
- 3、条件锁
- 4、事件锁
- 5、信号量锁
- 五、***锁
- 1、案例:鱼和熊掌不可兼得问题
- ��、进程与线程的区别
一、多线程
1、线程的生命周期
1、线程的创建:t=threading.Thread()
2、就绪状态:已经获得了除CPU之外的其他资源,正在参与调度,等待被执行,当调度完成之后,立即运行
3、启动状态:获得了CPU时间片段,正在运行
4、等待\阻塞状态:遇到time.sleep()时,会阻塞,暂时不参与调度,等待事件发生
5、中止状态:线程运行结束,run函数运行结束,等待系统回收其线程资源。
2、线程的创建(函数创建)
3、线程的创建(使用类)
t=MyThread(name=s[i]) 创建线程,里面的参数代表线程的名字,如果不传,系统会默认有一个名字
4、守护线程
当我们在程序运行中,执行一个主线程,如果主线程又创建一个子线程,主线程和子线程就分兵两路,分别运行,那么当主线程完成想退出时,会检验子线程是否完成。如果子线程未完成,则主线程会等待子线程完成后再退出。但是有时候我们需要的是只要主线程完成了,不管子线程是否完成,都要和主线程—起退出,这时就可以用setDaemon方法
输出结果:线程2还没有完整的执行完毕,遇到守护线程就终止执行了。
t.setDaemon(True) 当前的子线程设置为守护线程
守护线程:随着主线程的终止而终止,不管当前主线程下有多少子线程没有执行完毕,都会终。
二、全局解释器锁
1、GIL锁不是python的特点。而是cpython的特点。
每个线程在执行的时候都需要先获取GIL,保证同一时刻只有一个线程可以执行代码,即同一时刻只有一个线程使用CPU。在CPython中,每一个Python线程执行前都需要去获得GIL锁,获得该锁的线程才可以执行,没有获得的只能等待,当具有GIL锁的线程运行完成后,其他等待的线程就会去争夺GIL锁,这就造成了,在Python中使用多线程,但同一时刻下依旧只有一个线程在运行,所以Python多线程其实并不是「并行」的,而是「并发」。
1、使用单线程实现累加到500000000
import time,threadingdef task(n): sum=0 while sum