zoukankan      html  css  js  c++  java
  • 线程相关概念

    在传统操作系统中,每一个进程有一个地址空间,而且默认就有一个控制线程。

    进程只是用来把资源集中到一起(进程只是一个资源单位,或者说资源集合),而线程才是CPU上执行的单位。

    多线程:在一个进程中存在多个控制线程,多个控制线程共享该进程的地址空间,相当于一个车间内有多条流水线,都共用这一个车间的资源。

    守护线程:无论是线程还是进程,都遵循守护线程(进程)都会等待主线程运行完毕后被销毁,运行完毕不是终止运行

    对于主进程来说,运行完毕指的是主进程代码运行完毕;对主线程来说运行完毕指的是所在进程内所有非守护线程统统运行完毕,主线程才算运行完毕。

    同步锁:线程抢到的是GIL锁,GIL锁相当于是执行权限,拿到执行权限后才能拿到互斥锁LOCK,其他线程也可以抢到GIL,但如果发现Lock仍没有释放则阻塞,即便是拿到GIL也要立刻交出来。

    Join:是等待所有,即整体串行,而锁只是锁住修改共享数据的部分,即部分串行,要想保证数据的安全性根本原理在于让并发编程串行,join与互斥锁都可以实现,毫无疑问互斥锁的部分串行效率要更高。

    死锁:指的是两个或两个以上的进程或者线程在执行过程中,因为争夺资源而造成的一种互相等待的现象,若无外力的 作用,他们将都无法推进下去,此时系统处于死锁状态或者说系统产生了死锁,这些永远在等待的进程称为死锁进程。

    死锁的解决方法:递归锁在python中为支持在同一线程中多次请求同一资源,python提供了可重入锁RLock,在这个RLock内部维护着一个lock和一个counter变量,counter记录了acquire的次数,从而使资源可以被多次require,直到一个线程的acquire都被release,其他的线程才能获得资源。

    信号量:Semaohore管理一个内置的计数器,每当require()时内置计数器-1每当release()时内置的计数器+1,计数器不能小于0,当计数器为0 时,acquire()将阻塞线程直到其他线程调用release()

    与进程池是完全不同的概念,进程池Pool(4),最大只能产生4个进程,而且从头到尾都是只是这四个进程,不会产生新的,而信号量是产生一堆线程或者进程

    Event:线程的一个关键特征是每个线程都是独立运行且状态是不可预测。如果程序中其他线程需要通过判断某个线程的状态来确定自己下一步的操作,这时候线程同步问题就会变得非常棘手可以使用event来解决。

    event.isSet():返回event的状态值

    event.wait():如果event.isSet()==False将阻塞线程;

    event.set():设置event的状态值为True,所有阻塞池的线程激活进入就绪状态,等待操作系统调度

    event,clear():恢复event的状态值为False

  • 相关阅读:
    mysql where条件通过 regexp 正则来匹配查询数据
    mysql 面试实战
    mysql 面试
    MySQL常见面试题
    mysql面试
    Groovy安装
    Redis-(error) MISCONF Redis is configured to save RDB snapshots
    ubuntu 下openoffice安装
    Android 多屏幕适配 dp和px的关系
    linux 相关知识
  • 原文地址:https://www.cnblogs.com/AllenZhou/p/9606792.html
Copyright © 2011-2022 走看看