Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
paparika
V2EX  ›  Linux

这个场景下怎么加锁?

  •  
  •   paparika · Aug 27, 2018 · 3590 views
    This topic created in 2840 days ago, the information mentioned may be changed or developed.

    假设有 A,B,C 三个函数

    1.A 执行时,不能并发 B 或者 C

    2.B 或 C 执行时,不能并发 A

    3.B,C 之间可以并发执行

    这个场景锁应该怎么处理,C/C++

    12 replies    2018-08-27 16:01:37 +08:00
    sagaxu
        1
    sagaxu  
       Aug 27, 2018 via Android
    搞一个调度器,只锁调度器
    paparika
        2
    paparika  
    OP
       Aug 27, 2018
    @sagaxu 可以解释下吗
    des
        3
    des  
       Aug 27, 2018 via Android
    冲突的是资源,对资源加锁,函数持有资源
    Monad
        4
    Monad  
       Aug 27, 2018   ❤️ 4
    A 写锁 B/C 读锁
    paparika
        5
    paparika  
    OP
       Aug 27, 2018
    @Monad 好像是正解。读写互斥,读读不互斥对吧。另外如果我的场景是 A,B 两个函数,AB 间互斥,AA 互斥,BB 并发,也是用读写锁对吧
    4357
        6
    4357  
       Aug 27, 2018   ❤️ 2
    读写锁正解。
    还有一种办法,把 BC 封装到 D 中,D 和 A 互斥锁。
    paparika
        7
    paparika  
    OP
       Aug 27, 2018
    @4357 嗯,不过这样好像需要把 D 搞成异步任务的管理者
    linyinma
        8
    linyinma  
       Aug 27, 2018   ❤️ 1
    创建两把锁:

    A () {
    lock(lck1);
    lock(lck2);

    //do something

    lock(lck2);
    lock(lck1);

    }

    B() {
    lock(lck1);

    //do something

    lock(lck1);
    }

    C() {
    lock(lck2);

    //do something

    lock(lck2);
    }
    linyinma
        9
    linyinma  
       Aug 27, 2018
    //do something 后是 unlock
    paparika
        10
    paparika  
    OP
       Aug 27, 2018
    @linyinma 嗯,也是一种思路
    paparika
        11
    paparika  
    OP
       Aug 27, 2018
    @linyinma 又考虑了下,这个方式实际上是有问题的,比如 A 拿到 L1 后被 C 先抢到 L2,那么 C 就没办法和 B 并发了
    linyinma
        12
    linyinma  
       Aug 27, 2018
    注意 注意 “并发” 不等于 “并行” 不要偷换概念
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1369 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 46ms · UTC 17:07 · PVG 01:07 · LAX 10:07 · JFK 13:07
    ♥ Do have faith in what you're doing.