Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Parallele Programmierung (DE)
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Chris Eidhof | @chriseidhof
September 11, 2013
Technology
160
2
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Parallele Programmierung (DE)
Bei CocoaHeads Dresden
Chris Eidhof | @chriseidhof
September 11, 2013
More Decks by Chris Eidhof | @chriseidhof
See All by Chris Eidhof | @chriseidhof
Dutch FP Day 2015
chriseidhof
2
400
Tiny Networking in Swift
chriseidhof
2
19k
Functional Swift - Brooklyn
chriseidhof
3
1.3k
Functional Swift - SF
chriseidhof
6
26k
Functional Swift
chriseidhof
6
1.3k
Functional Swift
chriseidhof
1
170
Functional Programming in Swift
chriseidhof
40
19k
Lighter View Controllers
chriseidhof
4
210
Parsing with Blocks
chriseidhof
2
260
Other Decks in Technology
See All in Technology
AWS Security Agent といっしょに脅威モデリングをやってみよう
amarelo_n24
1
210
10年間のブログ発信を振り返って見えたWebアプリケーションエンジニアとしての軌跡
stefafafan
0
180
Kiro Ambassador を目指す話
k_adachi_01
0
130
ロボティクスの技術 / Robotics Technology
ks91
PRO
0
130
【セミナー資料】Claude Code をセキュアに使うための考え方と設定の勘どころ / Claude Code Webinar 20260616
masahirokawahara
2
460
AWS Security Hub CSPMの成功・失敗体験
cmusudakeisuke
0
540
5分でわかるDuckDB Quack
chanyou0311
3
250
[チョークトーク資料]AWS DevOps Agent を使いこなす / AWS Dev Ops Agent Chalk Talk AWS Summit Japan 2026
kinunori
4
770
クレデンシャル流出 ― 攻撃 3 時間 vs 復旧 10 時間。この非対称性にどう備えるか
kazzpapa3
3
560
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
5
1.7k
WebGIS AI Agentの紹介
_shimizu
0
550
徹底討論!ECS vs EKS!
daitak
3
1.7k
Featured
See All Featured
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
150
Are puppies a ranking factor?
jonoalderson
1
3.6k
Effective software design: The role of men in debugging patriarchy in IT @ Voxxed Days AMS
baasie
0
430
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
How to Align SEO within the Product Triangle To Get Buy-In & Support - #RIMC
aleyda
2
1.6k
Designing for Performance
lara
611
70k
Heart Work Chapter 1 - Part 1
lfama
PRO
7
36k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
230
Highjacked: Video Game Concept Design
rkendrick25
PRO
1
400
SEO Brein meetup: CTRL+C is not how to scale international SEO
lindahogenes
1
2.7k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
560
The Art of Delivering Value - GDevCon NA Keynote
reverentgeek
16
2k
Transcript
Parallele Programmierung Chris Eidhof Sunday, September 22, 13
Achtung Sunday, September 22, 13
Nicht alles muss async sein • Schwer zu debuggen •
Schwer zu lesen und schreiben • Fehleranfällig Sunday, September 22, 13
APIs • OpenCL • pthread • NSRunLoop • NSThread •
Grand Central Dispatch • Operation Queues Sunday, September 22, 13
pthread size_t count; }; struct threadResult { uint32_t min; uint32_t
max; }; void * findMinAndMax(void *arg) { struct threadInfo const * const info = (struct threadInfo *) arg; uint32_t min = UINT32_MAX; uint32_t max = 0; for (size_t i = 0; i < info->count; ++i) { uint32_t v = info->inputValues[i]; min = MIN(min, v); max = MAX(max, v); } free(arg); struct threadResult * const result = (struct threadResult *) malloc(sizeof(*result)); result->min = min; result->max = max; return result; } int main(int argc, const char * argv[]) { size_t const count = 1000000; uint32_t inputValues[count]; // Fill input values with random numbers: for (size_t i = 0; i < count; ++i) { inputValues[i] = arc4random(); } // Spawn 4 threads to find the minimum and maximum: size_t const threadCount = 4; pthread_t tid[threadCount]; for (size_t i = 0; i < threadCount; ++i) { struct threadInfo * const info = (struct threadInfo *) malloc(sizeof(*info)); size_t offset = (count / threadCount) * i; info->inputValues = inputValues + offset; info->count = MIN(count - offset, count / threadCount); int err = pthread_create(tid + i, NULL, &findMinAndMax, info); NSCAssert(err == 0, @"pthread_create() failed: %d", err); } // Wait for the threads to exit: struct threadResult * results[threadCount]; for (size_t i = 0; i < threadCount; ++i) { int err = pthread_join(tid[i], (void **) &(results[i])); NSCAssert(err == 0, @"pthread_join() failed: %d", err); } // Find the min and max: uint32_t min = UINT32_MAX; uint32_t max = 0; for (size_t i = 0; i < threadCount; ++i) { Sunday, September 22, 13
NSRunloop [self performSelector:@selector(mySelector:) withObject:nil afterDelay:1.0]; Sunday, September 22, 13
@interface FindMinMaxThread : NSThread @property (nonatomic) NSUInteger min; @property (nonatomic)
NSUInteger max; - (instancetype)initWithNumbers:(NSArray *)numbers; @end @implementation FindMinMaxThread { NSArray *_numbers; } - (instancetype)initWithNumbers:(NSArray *)numbers { self = [super init]; if (self) { _numbers = numbers; } return self; } - (void)main { NSUInteger min; NSUInteger max; // process the data self.min = min; self.max = max; } @end NSSet *threads = [NSMutableSet set]; NSUInteger numberCount = self.numbers.count; NSUInteger threadCount = 4; for (NSUInteger i = 0; i < threadCount; i++) { NSUInteger offset = (count / threadCount) * i; NSUInteger count = MIN(numberCount - offset, numberCount / threadCount); NSRange range = NSMakeRange(offset, count); NSArray *subset = [self.numbers subarrayWithRange:range]; FindMinMaxThread *thread = [[FindMinMaxThread alloc] initWithNumbers:subset]; [threads addObject:thread]; [thread start]; } NSThread Sunday, September 22, 13
Wie viele Threads brauchen wir? Sunday, September 22, 13
Grand Central Dispatch Sunday, September 22, 13
Sunday, September 22, 13
Sunday, September 22, 13
Sunday, September 22, 13
Parallel Seriell Sunday, September 22, 13
Prioritätsinversion R N H M Sunday, September 22, 13
Async Blocks dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(defaultQueue, ^{ [self
expensiveBackgroundCode]; }); Sunday, September 22, 13
UI Aktualisieren dispatch_queue_t defaultQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0); dispatch_async(defaultQueue, ^{ [self
expensiveBackgroundCode]; dispatch_async(dispatch_get_main_queue(), ^{ self.label.text = @"Done"; }); }); Sunday, September 22, 13
Mein Code: dispatch_async(backgroundQueue, ^{ NSData* contents = [NSData dataWithContentsOfURL:url]; dispatch_async(dispatch_get_main_queue(),
^{ // do something with the data. }); }); Sunday, September 22, 13
Probleme • Nicht abbrechbar • Blockierend Sunday, September 22, 13
NSOperationQueue NSOperationQueue* backgroundQueue; [backgroundQueue addOperation:downloadOperation]; Sunday, September 22, 13
Abbrechen [downloadOperation cancel]; Sunday, September 22, 13
Blocks [backgroundQueue addOperationWithBlock:^{ [self expensiveOperation]; }]; Sunday, September 22, 13
Eigene Operations @interface DownloadOperation : NSOperation @end Sunday, September 22,
13
Weitere Aspekte • Abhängigkeiten • maxConcurrentOperationCount • Auf Grand Central
Dispatch basiert Sunday, September 22, 13
Unterklassen • NSInvocationOperation • NSBlockOperation Sunday, September 22, 13
Async Core Data Am einfachsten: über den Haupt-Thread Sunday, September
22, 13
NSManagedObjectContext* context = [[NSManagedObjectContext alloc] initWithConcurrencyType: NSPrivateQueueConcurrencyType]; context.persistentStoreCoordinator = self.persistentStoreCoordinator;
Sunday, September 22, 13
[context performBlock:^{ [self expensiveImportOperation]; }]; Sunday, September 22, 13
Main context aktualisieren [[NSNotificationCenter defaultCenter] addObserverForName:NSManagedObjectContextDidSaveNotification object:nil queue:nil usingBlock:^(NSNotification* note)
{ NSManagedObjectContext *moc = mainManagedObjectContext; if (note.object != moc) { [moc performBlock:^(){ [moc mergeChangesFromContextDidSaveNotification:note]; }]; } }]; Sunday, September 22, 13
Es gibt noch immer ein Lock Du kannst aber zwei
Persistent Store Coordinators verwenden Sunday, September 22, 13
UI im Hintergrund [operationQueue addOperationWithBlock:^{ NSNumber* result = findLargestMersennePrime(); [[NSOperationQueue
mainQueue] addOperationWithBlock:^{ self.textLabel.text = [result stringValue]; }]; }]; Sunday, September 22, 13
UIKit ist nicht Threadsicher Sunday, September 22, 13
Parallel zeichnen UIGraphicsBeginImageContextWithOptions(size, NO, 0); // drawing code here UIImage
*i = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return i; Sunday, September 22, 13
Parallel zeichnen • Nur wenn es notwendig ist • Vielleicht
kannst du es vermeiden • WWDC 2012 - Building Concurrent User Interfaces on iOS Sunday, September 22, 13
More reading • http://www.objc.io/issue-2 • Concurrency Programming Guide Sunday, September
22, 13
Kontakt @chriseidhof http://www.objc.io http://www.uikonf.com http://chris.eidhof.nl Sunday, September 22, 13