问一个并发相关的问题 - V2EX
zhaogaz
V2EX    Java

问一个并发相关的问题

  •  
  •   zhaogaz Nov 16, 2018 3386 views
    This topic created in 2733 days ago, the information mentioned may be changed or developed.

    最近看了看并发编程相关的东西,看到了一个东西叫做无锁,原理大概就是反复重试,直到能修改,大部分人都说,这个能节省线程挂起的时间消耗.

    也就是说,对于无锁来说,就是两个线程不停地执行

    但是 cpu 在执行多个线程的时候,不也是不停的做 context switch 上下文切换么?


    假设有两个线程

    情况 1:这两个线程使用无锁的方式获取一个资源,在 cpu 层面,这两个线程就是各执行一会.不停地做上下文切换.

    情况 2:这两个线程使用一个读锁获取一个资源,其中一个线程拿到锁了,另一个阻塞等待.在 cpu 层面,那不就是一个线程一直执行么?不存在上下文切换了.


    所以为什么都说无锁效果更好?我的理解到底哪里错了?问题出在哪?

    7 replies    2018-12-03 11:20:07 +08:00
    ffeii
        2
    ffeii  
       Nov 16, 2018 via iPhone   1
    线程阻塞的多了就没有线程去处理请求了,并发就上不去
    sagaxu
        3
    sagaxu  
       Nov 16, 2018 via Android   2
    1. 这两个线程一直在做 cas,不会暂停,也没有上下文切换。
    2. 锁并不都是互斥的,没拿到锁被阻塞的线程,会从 CPU 的 running 队列剥离,有上下文切换。

    lock free 不是绝对的好,有它自己的适用场景。lock free 优点是 cost 很小,缺点是竞争激烈时不断重试占用了 CPU。

    某些系统实现,轻锁在遇到竞争时,膨胀成重锁。
    zhaogaz
        4
    zhaogaz  
    OP
       Nov 16, 2018
    @sagaxu 单核 CPU 上运行的多线程程序, 同一时间只能一个线程在跑, 系统帮你切换线程而已, 系统给每个线程分配时间片来执行我指的是这个上下文切换

    那两个线程不就是一直在做切换么?
    sagaxu
        5
    sagaxu  
       Nov 17, 2018 via Android   1
    @zhaogaz cpu 时间片通常是毫秒级的,lock free 持有锁到解锁之间的时间间隔通常是纳秒级的,在 A 线程占用 CPU 的时候,他都够锁和解锁上百万次了,lockfree 并没有带来更多的上下文切换。
    luozic
        6
    luozic  
       Nov 17, 2018 via iPhone   2
    现在不是推 IO 多路复用么。实际线程上的多路复用就是纤程,但是这些东西都是解决 IO 资源问题的,如果是计算为主的程序,切换线程屁用没有反而大大减速。 根据功能特点合理规划并发方式。 进程 线程 fiber 是一脉相承,ringbuffer akka 是另外一种套路。
    dahai1990
        7
    dahai1990  
       Dec 3, 2018
    @zhaogaz 你说的是在单核 CPU 上,在多核 CPU 上,多个线程同时执行,就没有上下文切换了。
    About     Help     Advertise     Blog     API     FAQ     Solana     1190 Online   Highest 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 41ms UTC 23:21 PVG 07:21 LAX 16:21 JFK 19:21
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86