对多线程的理解以及使用多线程时需要注意什么

学习自

https://www.zhihu.com/question/19901763/answer/13299543

首先明确核心数和线程数的关系

4核8线程,就好比有4个运算核心,8个线程(intel研发出了1个核心可以运行2个线程)

单线程的cpu只开一个子线程,一个人在桌上吃饭

单线程的cpu开多个子线程,多个人在一张桌子上吃饭

多线程的cpu开多个子线程,多个人在多张桌子上吃饭

线程的引入可以解耦资源分配与执行调度。各个线程既可以共享进程资源,又可以独立调度。线程和进程的本质区别是线程是CPU调度的单位,进程是资源单位。

线程有3种实现方式

1.内核线程

由内核完成线程切换,内核会把任务映射到线程处理器上。每个内核线程可以视为内核的分身,这样操作系统就有单线程数“多开”的本领了。程序一般不直接使用内核线程,而是使用轻量级线程来和内核线程一对一。

2.用户线程

内核线程代价太高了,数量也是有限的。用户线程自己实现,创建、切换、调度,操作系统只负责把资源给到进程就可以了。这样的实现太复杂了。

3.两者混合实现

这样一来,用户线程的创建、切换操作依旧廉价。轻量级线程是用户线程和核心线程沟通的桥梁。

线程的调度

有同步方式

有时间片轮转调度

线程的几种状态

新建

启动了,运行

阻塞、等待(object.wait,thread.join,locksupport.park,epoll实现的进程睡眠)

结束

多线程使用中注意的问题

1.线程上下文切换的开销很大

2.死锁,比如Java的锁死锁了,比如数据库死锁了

猜你喜欢

转载自blog.csdn.net/qq_36523667/article/details/81191141