<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      iOS開發-多線程編程

      OC中常用的多線程編程技術:

      1. NSThread

      NSThread是Objective-C中最基本的線程抽象,它允許程序員直接管理線程的生命周期。

      NSThread *myThread = [[NSThread alloc] initWithTarget:self selector:@selector(myThreadMainMethod:) object:nil];
      [myThread start];
      

      使用NSThread時,需要自己管理線程的生命周期,包括創建、啟動和銷毀線程。這種方法給了開發者很大的控制權,但也增加了復雜性,因為需要手動處理線程同步和線程安全問題。

      2. Grand Central Dispatch (GCD)

      GCD是一個強大的基于C語言的API,它提供了一個并發執行任務的低級別方式。GCD使用任務隊列和線程池來優化線程的使用。

      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
      dispatch_async(queue, ^{
          // 異步執行的任務
      });
      

      GCD是推薦的多線程編程方法之一,因為它的性能很好,而且簡化了并發編程的復雜性(下一節詳細介紹)。

      3. Operation Queues

      NSOperationNSOperationQueue提供了一個面向對象的方式來執行并發操作。NSOperation是一個抽象類,可以通過繼承它來定義具體的操作。

      NSOperationQueue *queue = [[NSOperationQueue alloc] init];
      NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self selector:@selector(myTaskMethod) object:nil];
      [queue addOperation:operation];
      

      NSOperationQueue可以管理多個NSOperation對象,它支持設置最大并發操作數和依賴關系。NSOperation比GCD更高級,它支持取消操作、設置操作依賴和觀察操作狀態。

      4. Perform Selector Methods

      Objective-C提供了performSelector:onThread:等方法來在指定的線程上執行方法。

      [self performSelector:@selector(myTaskMethod) onThread:myThread withObject:nil waitUntilDone:NO];
      

      這些方法簡單易用,但它們不提供GCD和NSOperation的強大功能。

      5. POSIX Threads (pthreads)

      POSIX線程是一套跨平臺的線程相關的API,Objective-C可以直接使用這些API,因為它是C語言的超集。

      #include <pthread.h>
      
      void *myThreadFunction(void *context) {
          // 線程執行的代碼
          return NULL;
      }
      
      pthread_t thread;
      pthread_create(&thread, NULL, myThreadFunction, NULL);
      

      pthreads提供了很大的控制力,但它是一個低級別的API,通常不推薦在OC中使用,除非需要與C庫交互或有特殊的線程管理需求。

      GCD的詳細介紹

      Grand Central Dispatch (GCD) 是 Apple 開發的一個強大的多核編程解決方案,它提供了一種簡單且高效的方式來管理并發任務。GCD 使用任務(blocks of code)和隊列(queues)的概念來執行工作。它是基于 C 語言實現的,可以在 Objective-C 和 Swift 中使用。

      核心概念

      任務

      任務是指要執行的工作,通常是以 block 的形式提供。在 Objective-C 中,一個任務可以是一個 block 或者一個函數。

      隊列

      隊列是一種特殊的數據結構,用于按順序存儲任務。GCD 提供了兩種類型的隊列:

      • 串行隊列(Serial Queue):一次只執行一個任務。隊列中的任務按照添加的順序依次執行。在內部實現了一種機制,確保隊列中的任務一次只能執行一個,并且按照它們被添加到隊列中的順序來執行。這是通過隊列管理和任務調度來實現的。

      當將一個任務提交到串行隊列時,這里是大致的工作流程:

      1. 任務排隊:任務被添加到隊列的末尾。如果隊列是空的,它會成為隊列中的第一個任務。

      2. 任務執行:隊列中的第一個任務(隊頭)被取出來執行。在這個任務執行期間,隊列不會執行或者開始執行任何其他任務。

      3. 任務完成:一旦當前執行的任務完成,它會從隊列中移除。

      4. 下一個任務:隊列中的下一個任務(現在是隊頭)開始執行。

      5. 重復過程:這個過程會一直重復,直到隊列中的所有任務都被執行完畢。

      串行隊列的關鍵特性是互斥執行,這意味著在任何給定時間點,隊列中只有一個任務在執行。這種互斥是由GCD的底層調度機制保證的,它確保了即使在多核處理器上,串行隊列上的任務也不會并行執行。

      這種執行方式使得串行隊列成為了同步執行任務的理想選擇,特別是需要按順序執行一系列任務,而這些任務又不能同時執行時(例如,當任務需要按特定順序訪問或修改共享資源時)。因此理論上一個線程就足夠了。這是串行隊列如何保證任務順序執行和互斥的關鍵。當一個任務在串行隊列中開始執行時,它會持續運行直到完成,然后隊列才會執行下一個任務。這個過程不需要同時有多個線程參與,因為不會有并行執行的情況。然而,實際上,由于GCD的工作原理,它可能會在內部使用多個線程來管理多個串行隊列。GCD使用線程池來優化線程的使用,這意味著它會根據需要動態地為隊列分配和回收線程。但對于任何單一的串行隊列來說,你可以認為它在任何時候都只在一個線程上執行任務。這種設計使得串行隊列成為管理共享資源和避免并發問題的理想工具,因為它簡化了同步和線程安全的需求。同時,它也減少了上下文切換的開銷,因為任務是在單個線程上連續執行的。

      • 并行隊列(Concurrent Queue):可以同時執行多個任務。任務可以并發執行,但完成的順序可能會不同。

      系統隊列

      GCD 提供了幾種不同類型的系統隊列:

      • 主隊列(Main Queue):串行隊列,用于在主線程上執行任務,通常用于更新 UI。
      • 全局隊列(Global Queues):并行隊列,有四個不同優先級的全局隊列:高、默認、低和后臺。

      Grand Central Dispatch (GCD) 提供了幾種不同類型的系統隊列,這些隊列是預先創建好的,可以直接使用。它們分為兩大類:主隊列(Main Queue)和全局隊列(Global Queues)。

      主隊列(Main Queue)
      • 主隊列是一個特殊的串行隊列,它在應用程序的主線程上執行任務。因為主線程通常用于更新UI,所以所有的UI更新都應該在主隊列上執行,以確保UI的平滑和響應性。
      • 使用dispatch_get_main_queue()函數可以獲取主隊列。
      dispatch_queue_t mainQueue = dispatch_get_main_queue();
      dispatch_async(mainQueue, ^{
          // 在主線程上更新UI
      });
      
      全局隊列(Global Queues)
      • 全局隊列是并行隊列,它們在后臺執行任務,不會阻塞主線程。全局隊列有四個不同的優先級:高(high)、默認(default)、低(low)和后臺(background)。這些優先級對應于系統為任務分配的相對重要性。
      • 使用dispatch_get_global_queue()函數可以獲取全局隊列,需要指定優先級和一個保留用的標志位(目前應該傳遞0)。
      dispatch_queue_t globalQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
      dispatch_async(globalQueue, ^{
          // 在后臺執行耗時任務
      });
      

      全局隊列的優先級:

      • 高優先級DISPATCH_QUEUE_PRIORITY_HIGH):用于需要立即執行的任務,但不應該阻塞主線程。
      • 默認優先級DISPATCH_QUEUE_PRIORITY_DEFAULT):用于大多數任務,如果沒有特殊的優先級要求,應該使用這個優先級。
      • 低優先級DISPATCH_QUEUE_PRIORITY_LOW):用于不急迫的任務,可以等待其他更重要的任務完成后再執行。
      • 后臺優先級DISPATCH_QUEUE_PRIORITY_BACKGROUND):用于那些用戶不太可能立即注意到的任務,如預取數據、維護或清理工作。
        注意以下事項:
      • 盡管全局隊列是并行隊列,但是任務的啟動順序仍然是按照它們被添加到隊列的順序。
      • 全局隊列不保證任務完成的順序,任務可以并發執行。
      • 主隊列保證任務按照添加的順序一個接一個地執行。
      • 在主隊列上同步執行任務會導致死鎖,因為主隊列等待同步任務完成,而同步任務又在等待主隊列可用,從而形成了相互等待的情況。

      自定義隊列

      除了系統隊列,GCD還允許創建自定義隊列。自定義隊列可以是串行的也可以是并行的。

      • 創建串行隊列:
      dispatch_queue_t serialQueue = dispatch_queue_create("com.example.mySerialQueue", DISPATCH_QUEUE_SERIAL);
      
      • 創建并行隊列:
      dispatch_queue_t concurrentQueue = dispatch_queue_create("com.example.myConcurrentQueue", DISPATCH_QUEUE_CONCURRENT);
      

      使用 GCD

      異步執行

      使用 dispatch_async 函數可以異步地將任務提交到隊列中。這意味著它不會等待任務完成,而是立即返回。

      dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
      dispatch_async(queue, ^{
          // 執行耗時的任務
      });
      

      同步執行

      使用 dispatch_sync 函數可以同步地將任務提交到隊列中。這會阻塞當前線程,直到任務執行完成。

      dispatch_sync(queue, ^{
          // 執行任務
      });
      

      延遲執行

      使用 dispatch_after 函數可以在指定的時間后異步執行任務。

      double delayInSeconds = 2.0;
      dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, (int64_t)(delayInSeconds * NSEC_PER_SEC));
      dispatch_after(popTime, dispatch_get_main_queue(), ^{
          // 2秒后執行的任務
      });
      

      一次性執行

      使用 dispatch_once 函數可以確保代碼塊只被執行一次,常用于創建單例。

      static dispatch_once_t onceToken;
      dispatch_once(&onceToken, ^{
          // 只執行一次的代碼
      });
      

      隊列組

      dispatch_group 允許多個任務作為一個組來提交,并在組中的所有任務完成時得到通知。

      dispatch_group_t group = dispatch_group_create();
      dispatch_group_async(group, queue, ^{
          // 任務1
      });
      dispatch_group_async(group, queue, ^{
          // 任務2
      });
      dispatch_group_notify(group, dispatch_get_main_queue(), ^{
          // 所有任務完成后執行
      });
      

      信號量

      dispatch_semaphore 用于控制訪問資源的線程數量,可以用來實現線程同步。

      dispatch_semaphore_t semaphore = dispatch_semaphore_create(1);
      dispatch_async(queue, ^{
          dispatch_semaphore_wait(semaphore, DISPATCH_TIME_FOREVER);
          // 訪問受限資源
          dispatch_semaphore_signal(semaphore);
      });
      

      注意事項

      • 不要在串行隊列上同步地執行任務,這可能會導致死鎖。
      • 盡量避免在主隊列上同步執行耗時任務,這會阻塞 UI 更新。
      • 使用 GCD 時,要注意內存管理,特別是在 block 中捕獲外部變量時。
      posted @ 2024-07-22 16:35  機械心  閱讀(177)  評論(0)    收藏  舉報
      主站蜘蛛池模板: 人摸人人人澡人人超碰97| 亚洲欧美国产日韩天堂区| 巨熟乳波霸若妻在线播放| 国产成人精品亚洲一区二区| 亚洲AV日韩AV激情亚洲| 亚洲一区二区三区久久受| 亚洲国产精品视频一二区| 亚洲欧洲日产国码久在线| 国产女人看国产在线女人| 亚洲成av人片无码天堂下载| 日本成本人片免费网站| 亚洲精品乱码久久久久久按摩高清| 国产一区二区波多野结衣| 日韩国产精品无码一区二区三区 | 丰满高跟丝袜老熟女久久| 本溪市| 激情国产一区二区三区四| 99中文字幕国产精品| 华人在线亚洲欧美精品| 蜜桃网址| 四虎国产精品久久免费地址| 四虎永久免费精品视频| 欧美一区二区三区啪啪| 国产精品啪| 国产99视频精品免费视频6| 国产美女裸身网站免费观看视频 | 无码欧亚熟妇人妻AV在线外遇| 国产亚洲av产精品亚洲| 久久久久久久一线毛片| 国产一区二区日韩在线| 风流老熟女一区二区三区| 久久美女夜夜骚骚免费视频 | 成人污视频| 少妇人妻偷人一区二区| 亚洲大尺度无码无码专线| 亚洲av成人一区在线| 亚洲中文久久久久久精品国产| 国产女人被狂躁到高潮小说| 在线观看无码av五月花| 亚洲av专区一区| 亚洲一二区在线视频播放|