C++ 線程(串行 并行 同步 異步)詳解
看了很多關于這類的文章,一直沒有總結。不總結的話就會一直糊里糊涂,以下描述都是自己理解的非官方語言,不一定嚴謹,可當作參考。
首先,進程可理解成一個可執行文件的執行過程。在ios app上的話我們可以理解為我們的app的.ipa文件執行過程也即app運行過程。殺掉app進程就殺掉了這個app在系統里運行所占的內存。
線程:線程是進程的最小單位。一個進程里至少有一個主線程。就是那個main thread。非常簡單的app可能只需要一個主線程即UI線程。當然大部分還是會有一些子線程的,比如如果你用了AFNetWorking,你的請求都是開辟了子線程。
關于串行,并行,同步,異步,我還是以下面代碼的方式做個說明。
首先button點擊事件運行在主線程里,先是在主線程里做了打印了一句話,然后創建了一個串行或者并行的隊列,之后連續創建了3個同步或者異步的block任務放入此隊列中,最后再在主線程里打印一句話。
- (IBAction)serialSync:(id)sender { NSLog(@"start log in main thread"]); dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL); for (NSInteger n = 0; n < 3; n++) { dispatch_sync(myQueue, ^{ for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"串行同步任務%ld -> 開始%@",n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"串行同步任務%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);}- (IBAction)serialAsync:(id)sender { NSLog(@"start log in main thread"]); dispatch_queue_t myQueue = dispatch_queue_create("myQueue", NULL);//創建一個串行隊列 for (NSInteger n = 0; n < 3; n++) { dispatch_async(myQueue, ^{ for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"串行異步任務%ld -> 開始%@",n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"串行異步任務%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);}- (IBAction)concurrentSync:(id)sender { NSLog(@"start log in main thread"]); dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); for (NSInteger n = 0; n < 3; n++) { dispatch_sync(myQueue, ^{ for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"并行同步任務%ld -> 開始%@",(long)n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"并行同步任務%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);}- (IBAction)concurrentAsync:(id)sender { NSLog(@"start log in main thread"]); dispatch_queue_t myQueue = dispatch_queue_create("myQueue", DISPATCH_QUEUE_CONCURRENT); for (NSInteger n = 0; n < 3; n++) { dispatch_async(myQueue, ^{ for (NSInteger i = 0; i < 500000000; i++) { if (i == 0) { NSLog(@"并行異步任務%ld -> 開始%@",n,[NSThread currentThread]); } if (i == 499999999) { NSLog(@"并行異步任務%ld -> 完成",(long)n); } } }); } NSLog(@"阻塞我沒有?當前線程%@",[NSThread currentThread]);}
最后的結果如圖:
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb