Некоторые вопросы о pthread_mutex_lock и pthread_mutex_unlock - PullRequest
0 голосов
/ 13 сентября 2010

Когда поток получил блокировку и выполнил следующий код, может ли поток разблокировать блокировку, которую он получил только с помощью оператора return? некоторый код, подобный этому.

static pthread_mutex_t mutex;

    int foo()
    {
        pthread_mutex_lock(mutex);

        .........
        execute some code here and some errors happen
                return -1;// but without pthread_mutex_unlock

        pthread_mutex_unlock(mutext)
        return 0;
    }

Некоторые ошибки происходят перед оператором pthread_mutex_unlock, и поток возвращается к вызываемому объекту. Будет ли поток возвращать блокировку мьютекста для других потоков без выполнения pthread_mutex_unlock?

Ответы [ 2 ]

2 голосов
/ 13 сентября 2010

Нет, блокировка не снимается автоматически. Вот почему в коде C ++ часто используется Resource Aquisition is Initialization (RAII), которая использует преимущества построения / разрушения, чтобы гарантировать, что каждый вызов функции блокировки имеет соответствующий вызов для разблокировки. Однако, если вы пишете чистый C-код, вам необходимо убедиться, что вы разблокируете мьютекс, даже в ситуациях с ошибками, прежде чем вернуться.

Обратите внимание, что вы можете немного упростить кодирование, выполнив следующие действия:

  static inline int some_function_critical_section_unsynchronized(void) {
       // ...
  }
  int some_function(void) {
       int status = 0;
       pthread_mutex_lock(mutex);
       status = some_function_critical_section_unsynchronized();
       pthread_mutex_unlock(mutex);
       return status;
  }

Другими словами, если вы можете разделить логику на более мелкие функции, вы сможете выделить код блокировки из своей логики. Конечно, иногда это невозможно (например, когда при таком кодировании критическая секция становится слишком большой, а для производительности требуется менее читаемая форма).

Если вы можете использовать C ++, я настоятельно рекомендую использовать boost :: thread и boost :: scoped_lock, чтобы гарантировать, что полученный мьютекс автоматически освобождается, когда его использование выходит за рамки.

1 голос
/ 13 сентября 2010

Нет, он не разблокирует мьютекс автоматически.Вы должны явно вызвать pthread_mutex_unlock() на пути ошибки, если мьютекс заблокирован функцией.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...