V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
paparika
V2EX  ›  Linux

这个场景下怎么加锁?

  •  
  •   paparika · 2018-08-27 09:30:24 +08:00 · 2941 次点击
    这是一个创建于 2041 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

    12 条回复    2018-08-27 16:01:37 +08:00
    sagaxu
        1
    sagaxu  
       2018-08-27 09:35:38 +08:00 via Android
    搞一个调度器,只锁调度器
    paparika
        2
    paparika  
    OP
       2018-08-27 09:42:40 +08:00
    @sagaxu 可以解释下吗
    des
        3
    des  
       2018-08-27 09:43:16 +08:00 via Android
    冲突的是资源,对资源加锁,函数持有资源
    Monad
        4
    Monad  
       2018-08-27 09:47:53 +08:00   ❤️ 4
    A 写锁 B/C 读锁
    paparika
        5
    paparika  
    OP
       2018-08-27 09:55:07 +08:00
    @Monad 好像是正解。读写互斥,读读不互斥对吧。另外如果我的场景是 A,B 两个函数,AB 间互斥,AA 互斥,BB 并发,也是用读写锁对吧
    4357
        6
    4357  
       2018-08-27 10:03:16 +08:00   ❤️ 2
    读写锁正解。
    还有一种办法,把 BC 封装到 D 中,D 和 A 互斥锁。
    paparika
        7
    paparika  
    OP
       2018-08-27 10:12:39 +08:00
    @4357 嗯,不过这样好像需要把 D 搞成异步任务的管理者
    linyinma
        8
    linyinma  
       2018-08-27 10:59:21 +08:00   ❤️ 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  
       2018-08-27 11:00:12 +08:00
    //do something 后是 unlock
    paparika
        10
    paparika  
    OP
       2018-08-27 12:07:56 +08:00
    @linyinma 嗯,也是一种思路
    paparika
        11
    paparika  
    OP
       2018-08-27 12:59:42 +08:00
    @linyinma 又考虑了下,这个方式实际上是有问题的,比如 A 拿到 L1 后被 C 先抢到 L2,那么 C 就没办法和 B 并发了
    linyinma
        12
    linyinma  
       2018-08-27 16:01:37 +08:00
    注意 注意 “并发” 不等于 “并行” 不要偷换概念
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2656 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 15:19 · PVG 23:19 · LAX 08:19 · JFK 11:19
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.