Семафорные очереди

Создайте переменную AVPlayer для вашего класса.

let player: AVPlayer = AVPlayer()

Затем создайте AVPlayerItem и установите для проигрывателя.

func prepareToPlayAudio() {
    let url = newUrl
    asset = AVAsset(url: url)

    let assetKeys = ["playable", "hasProtectedContent"]

    playerItem = AVPlayerItem(asset: asset,
                              automaticallyLoadedAssetKeys: assetKeys)

    playerItem.addObserver(self, forKeyPath: #keyPath(AVPlayerItem.status), options: [.old, .new], context: &playerItemContext)

    player = AVPlayer(playerItem: playerItem)
}

Затем добавьте наблюдателей для отслеживания состояния воспроизводимого элемента.

override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
    guard context == &playerItemContext else {
        super.observeValue(forKeyPath: keyPath, of: object, change: change, context: context)
        return
    }

    if keyPath == #keyPath(AVPlayerItem.status) {
        let status: AVPlayerItemStatus

        if let statusNumber = change?[.newKey] as? NSNumber {
            status = AVPlayerItemStatus(rawValue: statusNumber.intValue)!
        } else {
            status = .unknown
        }

        switch status {
        case .readyToPlay:
        // Ready to play.
        case .failed:
        // Player item error.
        case .unknown:
            // Item is not ready.
        }
    }
}
7
задан user82229 24 March 2009 в 20:22
поделиться

2 ответа

Семафоры начинают две операции:

  1. P() Получать семафор (Вы, кажется, называете это sem_wait)
  2. V() Выпускать семафор (Вы, кажется, называете это sem_post)

Семафоры также имеют целое число, связанное с ними, который является количеством параллельных потоков, позволенных передать P () без блокирования. Другие вызовы к P () заблокируются, до V () назван к свободному, определяет.

Это - классическое определение семафора.

Править: Семафоры не делают гарантии порядка. Они не должны на самом деле использовать очередь или другую структуру FIFO. Когда только один поток позволяется за один раз, когда он будет звонить V (), другой (возможно случайный), поток затем возвратится из своего P (), звонят и продолжаются.

10
ответ дан 6 December 2019 в 08:17
поделиться

Следующий поток, который разблокирует на, он sem_wait() будет любой поток, который решает ОС, следующий к контекстному переключению в. Никто не делает гарантии из упорядочивания; это зависит от стратегии планирования Вашей ОС. Это мог бы быть поток, который был от ЦП для самого длинного, или то, которому присвоили самый высокий "приоритет" или тот, который исторически имел определенную статистику использования ресурсов, или что бы то ни было.

Скорее всего, Ваш текущий поток (тот, который звонил sem_post()) продолжит работать некоторое время, до него или начинает ожидать ввода данных пользователем, блоков на другом семафоре, или исчерпывает его выделенный OS интервал времени. Затем ОС переключится в некоторый полностью несвязанный процесс для выполнения за частью секунды (вероятно, Firefox или что-то), затем уйдет и обработает некоторый сетевой трафик, вовлечет себя чашка чая, и, наконец, когда это найдет время для него, выберите, какой бы ни из других потоков похоже, на основе чего-то как то, чувствует ли это на основе прошлого, что особым потоком является больше ЦП или I/O-bound.

Во многих Ose приоритет отдан процессам I/O-bound, которые не были вокруг очень долго. Теория состоит в том, что новые процессы могли бы быть недолгими (если это уже было вокруг в течение пяти часов, разногласия - это, не будет заканчиваться в следующем 1 мс), таким образом, мы могли бы также закончить их. Процессы I/O-bound, вероятно, продолжат быть I/O-bound, что означает, что возможности, они собираются выключить ЦП вскоре при ожидании других ресурсов. В основном ОС хочет найти процесс, что это будет способным, чтобы быть сделанным с ASAP, таким образом, это может возвратиться к потягиванию его чая и выполнению Вашего вредоносного программного обеспечения.

12
ответ дан 6 December 2019 в 08:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: