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

Coding style 编码方式:锁定/解锁内部还是外部?,coding-style,locking,pthreads,objective-c++,Coding Style,Locking,Pthreads,Objective C++,另一个可能是空洞的问题: 如何锁定并发?执行者或调用者应该负责锁定线程吗 e、 没有特别的语言 Caller::callAnotherThread() { _executor.method(); } Executor::method() { _lock(); doSomething(); _unlock(); } 或 我对线程和锁定知之甚少,所以我想确保代码是健壮的。第二种方法允许线程不安全的调用。。。从技术上讲,您可以调用_executor.method()

另一个可能是空洞的问题:

如何锁定并发?执行者或调用者应该负责锁定线程吗

e、 没有特别的语言

Caller::callAnotherThread() {
    _executor.method();
}

Executor::method() {
    _lock();
    doSomething();
    _unlock();
}

我对线程和锁定知之甚少,所以我想确保代码是健壮的。第二种方法允许线程不安全的调用。。。从技术上讲,您可以调用_executor.method(),而无需执行任何类型的锁定

帮忙


谢谢,

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

  • 增加了函数/类用户的负担,增加了设计粘度
  • 您可以让呼叫者在不使用锁的情况下更新共享状态
  • 如果不同的函数以不同的顺序使用多个锁,则会引入死锁的可能性

  • 如果您在内部使用锁,则必须在手册文档中注明。否则,您的代码将成为并行执行的瓶颈,用户将很难知道真相。

    我们了解到,如果您需要同时执行多个相关的粒度操作,外部锁定将提供优势,或者使用对内部结构的引用—只要您需要一组工作以避免其他线程的攻击,您就可以持有一个锁

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


    也就是说,在某些情况下,内部锁定可以有一个更干净的api,前提是您可以确保不希望将锁定保留超过一个函数调用的时间。

    锁定/解锁(关键部分处理)非常依赖于编程语言。有些已经内置了对关键部分的支持,有些则没有。你有特别的语言吗?(pthreads向我推荐C/C++)+1。好的观点,但我认为有一些有效的情况,你也可以把门锁在外面。好的,这就是我到目前为止的做法D
    Caller::callAnotherThread() {
        _executor.lock()
        _executor.method();
        _executor.unlock()
    }
    
    Executor::method() {
        doSomething();
    }