Стиль кодирования: заблокировать / разблокировать внутренний или внешний? - PullRequest
1 голос
/ 10 сентября 2010

Другой, возможно, глупый вопрос стиля:

Как должен быть заблокирован параллелизм? Должен ли исполнитель или посетитель отвечать за блокировку потока?

например. без определенного языка ...

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

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

OR

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

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

Я мало знаю о многопоточности и блокировке, поэтому хочу убедиться, что код устойчивый. Второй метод позволяет выполнять небезопасные вызовы ... технически вы можете вызвать _executor.method (), не выполняя никакой блокировки.

Помощь

Спасибо

Ответы [ 2 ]

3 голосов
/ 10 сентября 2010

Блокировка должна выполняться не вызывающей, а вызывающей стороной. Вызываемый является единственным, кто знает, что нужно синхронизировать, и единственным, кто может это гарантировать. Если вы оставляете блокировку для вызывающих, вы делаете три плохих вещи:

  1. Вы увеличиваете нагрузку на пользователей вашей функции / класса, увеличивая расчетную вязкость.
  2. Вы позволяете абонентам обновлять общее состояние без блокировки.
  3. Вы вводите возможность взаимоблокировки, если разные функции принимают несколько блокировок в разном порядке.
0 голосов
/ 29 июня 2011

Если вы используете внутренние блокировки, вы должны указать это в документации по эксплуатации.Или ваш код станет узким местом параллельного выполнения, и пользователям будет сложно узнать правду.

...