Параллельная очередь блокировки - PullRequest
0 голосов
/ 22 февраля 2019

Я пытаюсь решить проблему производителя-потребителя, но я хочу, чтобы мой потребительский поток блокировался до тех пор, пока данные не станут доступны.У меня есть несколько потоков, производящих данные, но только один поток потребляет их.Когда элементы быстро добавляются в массив, я получаю «Поток 4: Фатальная ошибка: Индекс выходит за пределы диапазона» @ «result = self.array.remove (at: 0)».Когда элементы добавляются по одному (например, медленно, 500+ миллисекунд), это работает как ожидалось.Это кажется намного проще в C # с Monitor.Wait () / Pulse ().Как я могу заставить это работать быстро?Заранее спасибо.

let consume: DispatchQueue = DispatchQueue.global(qos: .userInteractive)
            consume.async {
                while self.mConnect {
                    let dg = self.queue.take()//block until item is available
                    //do something
                }
            }

...

public class SynchronizedQueue<Element> {
fileprivate let semaphore = DispatchSemaphore(value: 0)
fileprivate let queue = DispatchQueue(label: "fooBar", attributes: .concurrent)
fileprivate var array = [Element]()
private var isWaiting : Bool = false
func take() -> Element {
    var result : Element!
    queue.sync {
        if self.array.count == 0 {
            print("Waiting...")
            self.isWaiting = true
            self.semaphore.wait()
        }
        self.isWaiting = false
        print("Not waiting count = \(self.array.count)")
        result = self.array.remove(at: 0)
    }
    return result
}

func add(_ element : Element) {
    queue.sync {
        self.array.append(element)
        if self.isWaiting {
            self.semaphore.signal()
        }
    }
}

}

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