iOSマルチスレッド-GCDまとめ
4318 ワード
前言:最近会社のプロジェクトのコードに対して最適化して、最適化の過程の中でいつもGCDの処理の問題に出会って、開発は終わって、少し暇な時間はこの部分の知識に対して総括して、後で調べるのが便利です!
一.GCDとは
GCDはすべてGrand Central Dispatchと呼ばれ、libdispatchの市場名であり、libdispatchはiOSとOS Xのマルチコアハードウェア上での同時コードの実行をサポートするAppleのライブラリである.正確にはGCDは低レベルのC APIであり、GCDを通じて開発者はスレッドと直接付き合う必要がなく、キューにコードブロック(blockまたはC関数ポインタ)を追加するだけである.GCDはバックエンドでスレッドプールを管理しており、コードブロックがどのスレッドで実行されるかを決定するだけでなく、利用可能なシステムリソースに基づいてこれらのスレッドを管理しています.これにより、GCDによりスレッドが管理され、スレッドが作成される問題が解決される.
二.GCDのメリット柔軟性:GCDは、ロック、単一例などの一般的なモードでコードをより高性能な方法で最適化し、GCDはより多くの制御権限と多くの下位関数を提供することができます. 使いやすい:GCDは、ロックとスレッドだけでなく、使いやすい同時モデルを提供し、同時トラップを避けるのに役立ちます.また、blockベースでは、異なるコードの役割ドメイン間でコンテキストを伝達するのが極めて簡単です. パフォーマンス:GCDはシステム負荷に基づいてスレッド数を自動的に増減することができ、コンテキスト切替を低減し、計算効率を向上させることができます.
二.GCDのメリット
二.GCD関連備蓄知識ポイント
GCDを学ぶには、以下の知識点を備蓄しなければならない. Dispatch Objects :
GCDは純粋なC言語であるにもかかわらず、オブジェクト向けのスタイルに構築されている.GCDオブジェクトはdispatch objectと呼ばれ、すべてのdispatch objectsはOCオブジェクトである.他のOCオブジェクトと同様に、ARC(automatic reference counting)がオンの場合、dispatch objectsのretainとreleaseは自動的に実行されます.MRCであればdispatch objectsはdispatch_を使用しますretainとdispatch_releaseという2つの方法で参照カウントを制御します. Serial & Concurrent:
シリアルタスクは、毎回1つのタスクのみが実行され、同時タスクは同じ時間に複数のタスクが実行されることです. Synchronous & Asynchronous:
同期関数は、所定のタスクが完了した後に返され、タスクの実行時に現在のスレッドがブロックされることを意味します.非同期関数は、タスクが完了するのを待つことはありません.したがって、非同期関数は現在のスレッドをブロックせず、次の関数を実行し続けます. Concurrency & Parallelism:
同時実行とは、複数のタスクを同時に実行することを意味します.これらのタスクは、シングルコアCPU上で時間分割(時間共有)で同時に実行されるか、マルチコアCPU上で真の並列方式で実行されるかのいずれかである.次に、シングルコアデバイスもこれを実現するために、コンカレントタスクは、まずスレッドを実行し、コンテキスト切替を実行し、別のスレッドまたはプロセスを実行する必要があります.パラレルは、本当の意味でのマルチタスクが同時に実行されます. ** Context Switch:**
Context Switchはコンテキスト切替であり、1つのコンテキスト切替とは、1つのプロセスで異なるスレッドの実行を切り替えたときに実行状態を格納し、復元するプロセスを指す.このプロセスは、マルチタスクアプリケーションを記述する際に一般的ですが、追加のオーバーヘッドをもたらします. Dispatch Queues:
GCD dispatch queuesは強力なマルチタスクを実行するツールです.Dispatch queueは、タスクを受け入れることができ、タスクを先行先行(FIFO)の順序で実行するオブジェクトです.Dispatch queueは、任意のコードブロックを同時または直列に実行することができ、同時タスクはNSOperationQueueのようにシステム負荷に基づいて適切に同時実行され、シリアルキューは同じ時間に単一のタスクのみが実行される.Dispatch queuesの内部ではスレッドが使用されており、GCDはこれらのスレッドを管理し、Dispatch queuesを使用する場合は、自分でスレッドを作成する必要はありません.スレッドと直接通信するコードに比べてDispatch queuesの利点は、Dispatch queuesが特に便利で、タスクの実行がより効率的であることです. Queue Type:GCDは3種類のキュータイプ がある
Serial:シリアルキューは、タスクを事前にフェッチ(FIFO)する順序で実行するため、シリアルキューは特定のリソースにアクセスする同期処理によく使用されます.必要に応じて複数のキューを作成することもできますが、これらのキューは他のキューに比べて同時実行されます.すなわち、4つのシリアルキューを作成した場合、各キューは同じ時間に1つのタスクしか実行されません.この4つのタスクにとって、互いに独立し、同時に実行されます.シリアルキューを作成する必要がある場合は、一般的にdispatch_を使用します.queue_createという方法で実現します.
Concurrent:コンカレントキューは複数のタスクを同時に実行できますが、これらのタスクは先着順に実行されます.コンカレントキューは、システム負荷に基づいて、これらのタスクをコンカレントで実行することを適切に選択します.iOS 5の前に、コンカレントキューとは一般的にグローバルキュー(Global queue)を指し、プロセスには4つのグローバルキューが存在する:高、中(デフォルト)、低、バックグラウンドの4つの優先順位キューがあり、dispatch_を呼び出すことができる.get_global_queue関数は、キューにアクセスするために優先度を入力します.iOS 5以降もdispatch_queue_create、キュータイプDISPATCHを指定します.QUEUE_CONCURRENTは、自分で同時キューを作成します.
**Main dispatch queue:**メインスレッド機能と同じです.実際にmain queueにコミットされたタスクは、プライマリ・スレッドで実行されます.main queueはdispatchを呼び出すことができます.get_main_を参照してください.main queueはプライマリ・スレッドに関連付けられているため、シリアル・キューです.他のシリアルキューと同様に、このキューのタスクは一度に1つしか実行できません.すべてのタスクがプライマリ・スレッドで実行されることを保証し、プライマリ・スレッドはUIの更新に使用できる唯一のスレッドです.
二.GCDの使用と例
==キューの作成とキューの管理==
キューにタスクを追加することを決定した場合は、そのタイプのキューを使用するかを決定し、どのように使用するかを選択する必要があります.Dispatch queuesは、これらのタスクをシリアルまたは同時に実行することができ、キューをどのように使用するかという大まかな考えが頭に浮かぶと、キューのプロパティを迅速に設定することができます.次のセクションでは、キューの作成方法とキューのプロパティの設定方法について説明します.グローバルキュー を取得
複数のタスクを同時に実行する必要がある場合は、コンカレントキューが便利です.同時キューは、キュー内のタスクが先進的なリードアウト(FIFO)の順序で実行される特徴を保持するキューです.同時に、1つのコンカレントキューは、tの余分なタスクを除去することができ、これらのタスクの前に未完了のタスクも除去することができる.1つの同時キューで実際に実行されるタスク数は、システムのカーネル数、他のシリアルキューでのタスクの優先度、および他のプロセスの動作状態など、多くの要因によって決定されます.
システムは、各プログラムに4つのグローバルキューを提供します.これらのキューには、優先度のみで区別されます.この4つのタイプは、高、中(デフォルト)、低、バックグラウンドです.これらのキューはグローバルなので、直接作成することはできません.代わりにdispatch_を通じてget_global_queueこのメソッドはそれらを呼び出します.
詳細については、以下を参照してください.https://ecgbao.github.io/2017/04/14/Grand-Central-Dispatch/
一.GCDとは
GCDはすべてGrand Central Dispatchと呼ばれ、libdispatchの市場名であり、libdispatchはiOSとOS Xのマルチコアハードウェア上での同時コードの実行をサポートするAppleのライブラリである.正確にはGCDは低レベルのC APIであり、GCDを通じて開発者はスレッドと直接付き合う必要がなく、キューにコードブロック(blockまたはC関数ポインタ)を追加するだけである.GCDはバックエンドでスレッドプールを管理しており、コードブロックがどのスレッドで実行されるかを決定するだけでなく、利用可能なシステムリソースに基づいてこれらのスレッドを管理しています.これにより、GCDによりスレッドが管理され、スレッドが作成される問題が解決される.
二.GCDのメリット
二.GCDのメリット
二.GCD関連備蓄知識ポイント
GCDを学ぶには、以下の知識点を備蓄しなければならない.
GCDは純粋なC言語であるにもかかわらず、オブジェクト向けのスタイルに構築されている.GCDオブジェクトはdispatch objectと呼ばれ、すべてのdispatch objectsはOCオブジェクトである.他のOCオブジェクトと同様に、ARC(automatic reference counting)がオンの場合、dispatch objectsのretainとreleaseは自動的に実行されます.MRCであればdispatch objectsはdispatch_を使用しますretainとdispatch_releaseという2つの方法で参照カウントを制御します.
シリアルタスクは、毎回1つのタスクのみが実行され、同時タスクは同じ時間に複数のタスクが実行されることです.
同期関数は、所定のタスクが完了した後に返され、タスクの実行時に現在のスレッドがブロックされることを意味します.非同期関数は、タスクが完了するのを待つことはありません.したがって、非同期関数は現在のスレッドをブロックせず、次の関数を実行し続けます.
同時実行とは、複数のタスクを同時に実行することを意味します.これらのタスクは、シングルコアCPU上で時間分割(時間共有)で同時に実行されるか、マルチコアCPU上で真の並列方式で実行されるかのいずれかである.次に、シングルコアデバイスもこれを実現するために、コンカレントタスクは、まずスレッドを実行し、コンテキスト切替を実行し、別のスレッドまたはプロセスを実行する必要があります.パラレルは、本当の意味でのマルチタスクが同時に実行されます.
Context Switchはコンテキスト切替であり、1つのコンテキスト切替とは、1つのプロセスで異なるスレッドの実行を切り替えたときに実行状態を格納し、復元するプロセスを指す.このプロセスは、マルチタスクアプリケーションを記述する際に一般的ですが、追加のオーバーヘッドをもたらします.
GCD dispatch queuesは強力なマルチタスクを実行するツールです.Dispatch queueは、タスクを受け入れることができ、タスクを先行先行(FIFO)の順序で実行するオブジェクトです.Dispatch queueは、任意のコードブロックを同時または直列に実行することができ、同時タスクはNSOperationQueueのようにシステム負荷に基づいて適切に同時実行され、シリアルキューは同じ時間に単一のタスクのみが実行される.Dispatch queuesの内部ではスレッドが使用されており、GCDはこれらのスレッドを管理し、Dispatch queuesを使用する場合は、自分でスレッドを作成する必要はありません.スレッドと直接通信するコードに比べてDispatch queuesの利点は、Dispatch queuesが特に便利で、タスクの実行がより効率的であることです.
Serial:シリアルキューは、タスクを事前にフェッチ(FIFO)する順序で実行するため、シリアルキューは特定のリソースにアクセスする同期処理によく使用されます.必要に応じて複数のキューを作成することもできますが、これらのキューは他のキューに比べて同時実行されます.すなわち、4つのシリアルキューを作成した場合、各キューは同じ時間に1つのタスクしか実行されません.この4つのタスクにとって、互いに独立し、同時に実行されます.シリアルキューを作成する必要がある場合は、一般的にdispatch_を使用します.queue_createという方法で実現します.
Concurrent:コンカレントキューは複数のタスクを同時に実行できますが、これらのタスクは先着順に実行されます.コンカレントキューは、システム負荷に基づいて、これらのタスクをコンカレントで実行することを適切に選択します.iOS 5の前に、コンカレントキューとは一般的にグローバルキュー(Global queue)を指し、プロセスには4つのグローバルキューが存在する:高、中(デフォルト)、低、バックグラウンドの4つの優先順位キューがあり、dispatch_を呼び出すことができる.get_global_queue関数は、キューにアクセスするために優先度を入力します.iOS 5以降もdispatch_queue_create、キュータイプDISPATCHを指定します.QUEUE_CONCURRENTは、自分で同時キューを作成します.
**Main dispatch queue:**メインスレッド機能と同じです.実際にmain queueにコミットされたタスクは、プライマリ・スレッドで実行されます.main queueはdispatchを呼び出すことができます.get_main_を参照してください.main queueはプライマリ・スレッドに関連付けられているため、シリアル・キューです.他のシリアルキューと同様に、このキューのタスクは一度に1つしか実行できません.すべてのタスクがプライマリ・スレッドで実行されることを保証し、プライマリ・スレッドはUIの更新に使用できる唯一のスレッドです.
二.GCDの使用と例
==キューの作成とキューの管理==
キューにタスクを追加することを決定した場合は、そのタイプのキューを使用するかを決定し、どのように使用するかを選択する必要があります.Dispatch queuesは、これらのタスクをシリアルまたは同時に実行することができ、キューをどのように使用するかという大まかな考えが頭に浮かぶと、キューのプロパティを迅速に設定することができます.次のセクションでは、キューの作成方法とキューのプロパティの設定方法について説明します.
複数のタスクを同時に実行する必要がある場合は、コンカレントキューが便利です.同時キューは、キュー内のタスクが先進的なリードアウト(FIFO)の順序で実行される特徴を保持するキューです.同時に、1つのコンカレントキューは、tの余分なタスクを除去することができ、これらのタスクの前に未完了のタスクも除去することができる.1つの同時キューで実際に実行されるタスク数は、システムのカーネル数、他のシリアルキューでのタスクの優先度、および他のプロセスの動作状態など、多くの要因によって決定されます.
システムは、各プログラムに4つのグローバルキューを提供します.これらのキューには、優先度のみで区別されます.この4つのタイプは、高、中(デフォルト)、低、バックグラウンドです.これらのキューはグローバルなので、直接作成することはできません.代わりにdispatch_を通じてget_global_queueこのメソッドはそれらを呼び出します.
//
dispatch_queue_t aQueue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
//
DISPATCH_QUEUE_PRIORITY_HIGH
DISPATCH_QUEUE_PRIORITY_DEFAULT
DISPATCH_QUEUE_PRIORITY_LOW
DISPATCH_QUEUE_PRIORITY_BACKGROUND
詳細については、以下を参照してください.https://ecgbao.github.io/2017/04/14/Grand-Central-Dispatch/