57. Синхронизация
class OperationScheduler {
var readerQueue = NSOperationQueue()
var writerQueue = NSOperationQueue()
init () {
// Читатели должны выполняться параллельно
readerQueue.maxConcurrentOperationCount = MAX
// Писатели должны выполняться последовательно
writerQueue.maxConcurrentOperationCount = 1
}
...
}
85. Синхронизация
func startPhilosopher(index: Int) {
let operation = PhilosopherBlockOperation(index: index)
let leftQueue = getLeftPhilosopher(index)
let leftPhilosopherEats = leftQueue.operationCount > 0
if (leftPhilosopherEats) {
for leftOperation in leftQueue.operations {
operation.addDependency(leftOperation)
}
}
// То же и для правого соседа
let currentPhilosopherQueue = philosopherQueues[index]
currentPhilosopherQueue.addOperation(operation)
}
86. Синхронизация
func diningPhilosophers() {
let scheduler =
DiningPhilosophersOperationScheduler()
scheduler.startPhilosopher(0)
scheduler.startPhilosopher(3)
scheduler.startPhilosopher(2)
scheduler.startPhilosopher(1)
scheduler.startPhilosopher(4)
}
> philosopher 0 is thinking
> philosopher 0 is eating
> philosopher 3 is thinking
> philosopher 3 is eating
> philosopher 2 is thinking
> philosopher 1 is thinking
> philosopher 4 is thinking
> philosopher 3 puts forks
> philosopher 0 puts forks
> philosopher 2 is eating
> philosopher 4 is eating
> philosopher 2 puts forks
> philosopher 4 puts forks
> philosopher 1 is eating
> philosopher 1 puts forks
87. Синхронизация
> philosopher 0 is thinking
> philosopher 0 is eating
> philosopher 3 is thinking
> philosopher 3 is eating
> philosopher 2 is thinking
> philosopher 1 is thinking
> philosopher 4 is thinking
> philosopher 3 puts forks
> philosopher 0 puts forks
> philosopher 2 is eating
> philosopher 4 is eating
> philosopher 2 puts forks
> philosopher 4 puts forks
> philosopher 1 is eating
> philosopher 1 puts forks
Ф.0
Ф.1
Ф.2
Ф.3
Ф.4