заблокировать охрану - будет ли в очереди несколько запросов - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть четыре функции-члена, которые можно вызывать несколько раз асинхронно из другого фрагмента кода - но поскольку эти функции используют свои переменные-члены класса, я должен убедиться, что до тех пор, пока одно выполнение вызова не закончится, второй долженне запускаться, но находиться в очереди.

Я слышал о функции защиты от блокировки в C ++, которая создает блок кода - в моем случае как автоматическая блокировка на время для функции:

void DoSomeWork()
{
    std::lock_guard<std::mutex> lg(m); // Lock will be held from here to end of function
--------;
return;
}

Поскольку мои четыре метода класса выполняют независимую работу, я должен иметь четыре мьютекса по одному для каждой блокировки блокировки для каждой функции-члена.Будут ли асинхронные вызовы находиться в какой-то очереди, если защита блокировки активна?

Я имею в виду, если, скажем, 10 вызовов этого метода-члена сделаны одновременно - поэтому, как только 1-й вызов получит защиту блокировки,Оставшиеся 9 запросов на вызов подождут, пока блокировка освободится, и начнут выполнение по одному?

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Предполагая, что вы имеете в виду несколько потоков, выдающих блокировки для одного и того же мьютекса, основываясь на предыдущих вопросах, нет очереди для pthreads или posix-типов синхронизации.Скажем, у нескольких потоков есть цикл, который начинается с блокировки и заканчивается разблокировкой, возвращаясь обратно к запросу блокировки, и в этом случае один и тот же поток может продолжать получать блокировку, и ни один из других потоков не будет работать (есть оченьмалая вероятность того, что между разблокировкой и блокировкой может возникнуть временной интервал, переключение контекста на другой поток).Использование условных переменных также имеет проблему с ложным пробуждением.

https://en.wikipedia.org/wiki/Spurious_wakeup

На основе тестирования собственные типы синхронизации Windows (CreateMutex, CreateSemaphore, WaitForSingleObject, WaitForMultipleObjects) выполняют запросы очереди, но яне нашел его документированным.

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

0 голосов
/ 05 декабря 2018

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

Обратите внимание, что при попытке заблокировать мьютекс несколько разиз одного потока неопределенное поведение .Не делайте этого.

Для получения дополнительной информации см., Например, this std::mutex reference .

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