Семафорное ожидание в блокировке мьютекса - PullRequest
0 голосов
/ 13 июня 2018

Могу ли я вызвать semaphore.wait() в mutex_lock, если в пути каким-то образом можно гарантировать, что ресурс, защищенный семафором, доступен?

Т.е. я хочу сделать что-то вроде следующего:

void some_function {

    mutex_lock()
    // Do something
    if (certain_conditions == TRUE) {
        semaphore_wait()   // Guaranteed that resource is available.
                           // Can not get blocked for sure.
    } 
    // Do some more things
    mutex_unlock()

}

1 Ответ

0 голосов
/ 13 июня 2018

По сути, ответ на ваш вопрос: Да.Вы можете вызвать примитив ожидания на семафор в контексте блокировки Mutex .

На самом деле, это то, что постоянно делается.Подумайте, например, о реализации служб IPC очереди сообщений с помощью счетчика семафоров: вам нужно заблокировать Mutex, защищающий очередь, перед вызовом вашего примитива "ожидание" на счетчике семафора.

Думая о POSIX, если у вас естьчтобы реализовать почтовый ящик (типичный пример производителя / потребителя), вы можете легко и безопасно сделать это с помощью переменных Mutex и Condition (которые будут использоваться в качестве семафоров).То, что вы хотите сделать, не является чем-то странным, если вы контролируете ситуацию.

...