Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
Parallele Programmierung (DE)
Search
Chris Eidhof | @chriseidhof
September 11, 2013
Technology
180
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
420
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
180
Functional Programming in Swift
chriseidhof
40
19k
Lighter View Controllers
chriseidhof
4
230
Parsing with Blocks
chriseidhof
2
270
Other Decks in Technology
See All in Technology
Gifu WordPress Meetup #200 に向けて、私たちには何ができるだろうか?/ 2026-11-07 Gifu WordPress Meetup
torounit
0
250
TSKaigi Sendai 2026 - tsgo時代のTypeScript Playgroundはどう動くか
teamlab
PRO
0
110
公共分野での生成AI活用
toru_kubota
1
310
現場を動かすAIエージェント#2_製造業現場でのAI活用から見た、ハマる罠と実践知
kintotechdev
2
210
会社説明資料_最新版
demaecan
0
32k
IBC 2026 動画技術関連レポート / IBC 2026 Report
cyberagentdevelopers
PRO
2
450
AX時代の自治体支援リソース再配分と役割分担の再構成:戦略とロードマップ(概要)
sishi2026
0
210
An Introduction to Context Ontology Accelerator (teaching AI agents what your data means)
inariku
PRO
1
200
Metadata - Section 3 : Dublin Core Standard · DC
mohab1
0
120
Claude Codeで作ったアプリを安全に公開する/Built with Claude Japan 2026
yoshidashingo
0
220
令和の今、あらためて IAM を考える。アクセスキーを「無くせない現実」との向き合い方
kazzpapa3
0
560
仕様と現実の間で落とし所を探るリモートMCPの認証・認可 — Sansanの認証基盤における課題と実践
sansantech
PRO
2
230
Featured
See All Featured
Templates, Plugins, & Blocks: Oh My! Creating the theme that thinks of everything
marktimemedia
31
2.9k
What's in a price? How to price your products and services
michaelherold
247
13k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.8k
Intergalactic Javascript Robots from Outer Space
tanoku
273
28k
How GitHub (no longer) Works
holman
316
150k
Crafting Experiences
bethany
1
430
Mozcon NYC 2025: Stop Losing SEO Traffic
samtorres
1
600
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
620
Paper Plane (Part 1)
katiecoart
PRO
2
12k
Organizational Design Perspectives: An Ontology of Organizational Design Elements
kimpetersen
PRO
1
880
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
470
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