zoukankan      html  css  js  c++  java
  • 并发编程注意的问题

    本文学习自博主

    并发是为了提高程序的执行速度,并不是线程越多越好,并发过程要注意三个问题:

    1.上下文切换

    2.死锁

    3.资源限制

    上下文切换会带来额外的开销

    1.线程的运行机制:

      一个CPU每一时刻只能执行一条主线程;

      操作系统会给每条线程分配不同长度的时间片;

      操作系统会随机从就绪等待状态的线程中随机选取一条执行;

      每条线程用完自己的时间片后,即使线程没有执行完毕也会停止执行,操作系统随机选取一条新线程执行;

    2.上下文切换:当一条线程的时间片用完后,操作系统会停止该线程,并保存当前线程的信息状态,然后选取一条新线程来执行。

    3.上下文切换是有开销的

      每次上下文切换都需要保存当前线程的执行状态,并加载新线程先前状态。如果上下文切换频繁,那么CPU花在上下文切换的时间占比增加,真正处理任务的占比就会减少,因此,为了提高处理任务的  效率,我们就要减少上线问起切换次数。

    4.减少上下文切换次数

      减少线程的数量

      控制同一线程上锁的数量

      采用无锁并发编程:1)无共享变量,独立执行。2)有共享变量,控制执行顺序(CAS算法)

    并发不当可能会产生死锁

    1.死锁:多条线程相互等待已经被对方占用的资源时产生。

    2.如何避免死锁

      不要在一个线程中嵌套使用多个锁;

      不要在一个线程中嵌套占用多个计算机资源;

      给锁和资源加超时时间;

    计算机资源会限制并发

    硬件资源:磁盘读写速度,带宽等。

    软件资源:Socket连接数,数据库连接数等。

    当程序执行线程时,并非是一行一行的运行代码,要进行重排序。、

    重排序:编译器处理器在不改变程序结果的前提下,重新排列指令的执行顺序,以达到最佳运行效率。

      

      

  • 相关阅读:
    推荐系统相关知识
    关于hive核心
    关于hive的基础
    立个flag
    关于数据增强——文本增强
    .NET Core 实践:事件通知和异步处理
    .NET Core 实践:微服务架构的优点
    C#一定比C++性能差?当然不!破除迷信,从我做起!
    Visual Studio Code 搭配 Docker 一键搭建golang开发环境
    单例双重检查引发的资源竞争/数据竞争
  • 原文地址:https://www.cnblogs.com/fenggedainifei/p/9667349.html
Copyright © 2011-2022 走看看