1.多線程的底層實現安全
(1)首先回答什麼是線程網絡
1個進程要想執行任務,必須得有線程.線程是進程的基本執行單元,一個進程(程序)的全部任務都在線程中執行多線程
(2)什麼是多線程併發
1個進程中能夠開啓多條線程,每條線程能夠並行(同時)執行不一樣的任務。異步
多線程的做用:更新顯示UI界面、處理用戶觸摸事件。async
(3)Mach是第一個以多線程方式處理任務的系統,所以多線程的底層實現機制是基於Mach的線程。函數
(4)開發中實現多線程的方案性能
1》C語言的POSIX接口:#include<pthread.h>spa
2》OC的NSThread操作系統
3》 C語言的GCD接口(性能最好,代碼更精簡)
4》 OC的NSOperation和NSOperationQueue(基於GCD)
2.線程的通訊
(1)GCD:
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 下載圖片
UIImage *image = nil;
dispatch_async(dispatch_get_main_queue(), ^{
// 回到主線程
});
(2)NSThread的線程通訊
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 下載圖片
UIImage *image = nil;
[self performSelector:@selector(settingImage:) onThread:[NSThread mainThread] withObject:image waitUntilDone:YES modes:nil];
}
這種狀況 也適用於子線程之間的通訊。
(3)NSThread的線程通訊
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
// 下載圖片
UIImage *image = nil;
[self performSelectorOnMainThread:@selector(settingImage:) withObject:image waitUntilDone:YES];
}
3.網絡圖片處理問題中怎麼解決一個相同的網絡地址重複請求的問題
利用字典圖片地址爲key,下載操做爲value
4. 列舉cocoa中常見對幾種多線程的實現,並談談多線程安全的幾種解決辦法及多線程安全怎麼控制?
1》開發中實現多線程的方案
1》C語言的POSIX接口:#include<pthread.h>
2》OC的NSThread
3》 C語言的GCD接口(性能最好,代碼更精簡)
4》 OC的NSOperation和NSOperationQueue(基於GCD)
2》多線程安全的解決方案
1》只在主線程刷新訪問UI
2》若是要防止資源搶奪,得用synchronize進行加鎖保護。
3》若是異步操做要保證線程安全等問題,儘可能使用GCD。(GCD有些函數默認就是安全的)
5.GCD內部怎麼實現的
1》 iOS和OSX的核心是XNU內核(蘋果電腦發展的操做系統內核),GCD是基於XNU內核實現的。
2》GCD的API所有在libdispatch庫中
3》GCD的底層實現主要有:Dispatch Queue和Dispatch Source
Dispatch Queue :管理block操做
Dispatch Source:處理事件(好比說線程間的通訊)
6.GCD和NSOperationQueue
1》GCD是純C語言的API,NSOperationQueue是基於GCD的OC版本的封裝
2》GCD只支持FIFO的隊列,NSOperationQueue能夠很方便的調整執行順序,能夠添加依賴設置最大併發數量。
3》GCD的執行速度比NSOperationQueue快
4》NSOperationQueue支持KVO,能夠檢測Operation是否正在執行,是否結束,是否取消。
如何進行選擇?
任務之間不太相互依賴,選用GCD;
任務之間有依賴,或者要監放任務的執行狀況:NSOperationQueue