Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Parallele Programmierung (German!)

Parallele Programmierung (German!)

Florian Kugler

October 05, 2013
Tweet

More Decks by Florian Kugler

Other Decks in Programming

Transcript

  1. Ablauf •APIs zur parallelen Programmierung •Einfache Beispiele für Nebenläufigkeit •Zeichnen

    im Hintergrund •Core Data im Hintergrund •Komplexität von Nebenläufigkeit
  2. NSRunLoop •Keine echte Nebenläufigkeit •Geeignet zur asynchronen Ausführung von Code

    in einem Thread •-[NSObject performSelector:withObject:afterDelay:] •+[NSTimer scheduledTimerWithTimeInterval: target: selector: userInfo: repeats:] •NSURLConnection
  3. libdispatch •serial queues / concurrent queues / target queue •dispatch_sync

    / dispatch_async •dispatch_group_async / disaptch_group_notify •dispatch sources •dispatch I/O
  4. libdispatch dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ NSData *result

    = [NSData dataWithContentsOfURL:someURL]; dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image = [UIImage imageWithData:result]; }); });
  5. libdispatch dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(queue, ^{ NSData *result

    = [NSData dataWithContentsOfURL:someURL]; dispatch_async(dispatch_get_main_queue(), ^{ self.imageView.image = [UIImage imageWithData:result]; }); });
  6. Serial Queue Serial Queue Serial Queue Main Queue High Priority

    Queue Default Priority Queue Low Priority Queue Background Priority Queue GCD Thread Pool Main Thread Concurrent Queue Serial Queue Concurrent Queue Threads GCD Queues Custom Queues
  7. NSOperationQueue @interface MyOperation : NSOperation @end MyOperation *myOperation = [[MyOperation

    alloc] init]; [[NSOperationQueue mainQueue] addOperation:myOperation];
  8. Zeichnen im Hintergrund •UIKit is nicht thread-safe •Aber wir können

    im Hintergrund mit Core Graphics zeichnen und dem Main Thread ein UIImage zurückgeben
  9. Core Data im Hintergrund •NSManagedObjects sind an den Kontext und

    Thread gebunden, in dem sie initialisiert wurden •Nebenläufige Contexte können zu Konflikten führen •Merge Policy
  10. Zwei Coordinators Persistent Store Coordinator Main Context Persistent Store SQLite

    Hintergrund Context Persistent Store Coordinator Persistent Store
  11. Race Condition Thread A Thread B Integer 17 lesen 17

    lesen 17 Zeit 17 + 1 = 18 erhöhen 17 + 1 = 18 erhöhen schreiben 18 schreiben 18 Thread A Thread B Integer 17 lesen 17 lesen 17 Zeit 17 + 1 = 18 erhöhen 17 + 1 = 18 erhöhen schreiben 18 schreiben 18
  12. Locking •Nur ein Task darf gleichzeitig auf eine Resource zugreifen

    •Alle anderen müssen warten •Einfachste Beispiele in Objective-C: •@property (atomic, ...) ... •@synchronized() {}
  13. Locking Thread A Thread B Integer 17 17 Zeit 17

    + 1 = 18 erhöhen schreiben 18 Lock lesen lock unlock 18 18 + 1 = 19 erhöhen schreiben 19 lesen lock unlock Thread A Thread B Integer 17 17 Zeit 17 + 1 = 18 erhöhen schreiben 18 Lock lesen lock unlock 18 18 + 1 = 19 erhöhen schreiben 19 lesen lock unlock
  14. Dead Locks Thread 1 Thread 2 Zeit lock Versuch Lock

    Y lock lock lock Versuch Lock X Thread 1 Thread 2 Zeit lock Versuch Lock Y lock lock lock Versuch Lock X
  15. Starvation •Tasks, die ein Schreib-Lock brauchen, kommen nicht zum Zug

    •Tasks, die nur ein Lese-Lock brauchen, blockieren Schreib-Tasks
  16. Priority Inversion •Mars Rover Pathfinder scheiterte beinahe an einem Priority

    Inversion Bug •Konstellation, in der ein Task niedrigerer Priorität Tasks mit höherer Priorität blockiert •objc.io/issue-2/concurrency-apis-and-pitfalls.html •Relevant für Objective-C Programmierer, denn libdispatch bietet Queues mit verschiedenen Prioritäten an
  17. Komplexität •Nebenläufigkeit hat viele schwierige Probleme •Benutzt den Main-Thread wenn

    möglich •Haltet nebenläufigen Code so einfach wie möglich