代码之家  ›  专栏  ›  技术社区  ›  Stephen Furlani

编码方式:锁定/解锁内部还是外部?

  •  1
  • Stephen Furlani  · 技术社区  · 14 年前

    另一个可能毫无意义的问题:

    e、 没有特别的语言。。。

    Caller::callAnotherThread() {
        _executor.method();
    }
    
    Executor::method() {
        _lock();
        doSomething();
        _unlock();
    }
    

    或者

    Caller::callAnotherThread() {
        _executor.lock()
        _executor.method();
        _executor.unlock()
    }
    
    Executor::method() {
        doSomething();
    }
    

    我对线程和锁知之甚少,所以我想确保代码是健壮的。第二种方法允许线程不安全的调用。。。你可以打电话_执行人方法()不执行任何类型的锁定。

    救命啊?

    谢谢,

    2 回复  |  直到 14 年前
        1
  •  5
  •   Peter Ruderman    14 年前

    应该由被调用方而不是调用方执行锁定。被叫方是唯一知道需要同步什么的人,也是唯一能够确保同步的人。如果你把锁留给打电话的人,你会做三件坏事:

    1. 如果不同的函数以不同的顺序使用多个锁,则会引入死锁的可能性。
        2
  •  1
  •   eonil    14 年前

        3
  •  1
  •   jv-dev    6 年前

    我们了解到,如果您需要同时执行几个相关的细粒度操作,或者使用对内部结构的引用,那么外部锁定提供了一些优势—您可以持有一个锁,只要您需要您的工作集不受其他线程的影响。

    例如:管理项目列表的容器可能希望提供一个api来获取对一个项目的可变引用。在没有外部锁定的情况下,一旦函数调用完成,另一个线程可能会锁定和改变数据。一个可行的解决方案是返回一个项目的副本,但这是低效的。