95 lines
1.9 KiB
Swift
95 lines
1.9 KiB
Swift
import Foundation
|
|
|
|
@main
|
|
|
|
struct App {
|
|
|
|
static func main() {
|
|
|
|
class Warehouse {
|
|
|
|
var stock: Int = 10
|
|
|
|
}
|
|
|
|
let warehouse = Warehouse()
|
|
|
|
let semStartB = DispatchSemaphore(value: 0)
|
|
|
|
let semBFinishedRead = DispatchSemaphore(value: 0)
|
|
|
|
let semAFinishedCart = DispatchSemaphore(value: 0)
|
|
|
|
let semBFinishedUpdate = DispatchSemaphore(value: 0)
|
|
|
|
let semDone = DispatchSemaphore(value: 0)
|
|
|
|
Thread.detachNewThread {
|
|
|
|
let localStockA = warehouse.stock
|
|
|
|
print("Thread A liest den Lagerbestand (\(localStockA) Stück)")
|
|
|
|
semStartB.signal()
|
|
|
|
semBFinishedRead.wait()
|
|
|
|
print("Thread A legt Smartphone in den Warenkorb")
|
|
|
|
let newStockA = localStockA - 1
|
|
|
|
semAFinishedCart.signal()
|
|
|
|
semBFinishedUpdate.wait()
|
|
|
|
warehouse.stock = newStockA
|
|
|
|
print(
|
|
|
|
"Thread A aktualisiert den Lagerbestand auf \(warehouse.stock) Stück (\(localStockA) Stück - 1 Stück)"
|
|
|
|
)
|
|
|
|
semDone.signal()
|
|
|
|
}
|
|
|
|
Thread.detachNewThread {
|
|
|
|
semStartB.wait()
|
|
|
|
let localStockB = warehouse.stock
|
|
|
|
print("Thread B liest den Lagerbestand (\(localStockB) Stück)")
|
|
|
|
print("Thread B legt 2 Smartphones in den Warenkorb")
|
|
|
|
let newStockB = localStockB - 2
|
|
|
|
semBFinishedRead.signal()
|
|
|
|
semAFinishedCart.wait()
|
|
|
|
warehouse.stock = newStockB
|
|
|
|
print(
|
|
|
|
"Thread B aktualisiert den Lagerbestand auf \(warehouse.stock) Stück (\(localStockB) Stück - 2 Stück)"
|
|
|
|
)
|
|
|
|
semBFinishedUpdate.signal()
|
|
|
|
semDone.signal()
|
|
|
|
}
|
|
|
|
semDone.wait()
|
|
|
|
semDone.wait()
|
|
|
|
print("Endgültiger Lagerbestand im System: \(warehouse.stock) Stück")
|
|
|
|
}
|
|
|
|
}
|