Как изменить максимальное количество семафоров после его создания? - PullRequest
0 голосов
/ 15 июня 2019

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

Пример 1

В NSOperationQueue есть свойство с именем maxConcurrentOperationCount. Это значение можно изменить после создания очереди. В документации отмечается, что изменение этого значения не влияет на уже выполняющиеся операции, но влияет на ожидающие задания, которые, вероятно, ожидают выполнения блокировки или семафора.

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

Пример 2:

В большинстве примеров кода Apple для Metal они используют семафор с начальным счетом 3 для управления буферами в полете. Я хотел бы поэкспериментировать с изменением этого числа во время работы моего приложения, просто чтобы увидеть, насколько оно существенно. Я мог бы разрушить весь класс, который использует этот семафор, а затем перестроить конвейер Metal, но это немного тяжело. Как и выше, мне любопытно, как я могу структурировать последовательность блокировок или семафоров, чтобы позволить мне заменять этот семафор на другой, пока все работает.

Мой опыт работы с Grand Central Dispatch, но я также заинтересован в реализации C ++, которая может использовать эти блокирующие или атомарные конструкции.

Я должен добавить, что я знаю, что технически я могу просто делать несбалансированные звонки на signal и wait, но мне это не кажется правильным. А именно, любой код, который вносит эти изменения, должен иметь возможность блокировать себя, если wait требуется некоторое время, чтобы уменьшить количество ...

...