Haili Tian
2013-08-10
Androidによってパッケージ化された同期クラスには、主にMUTEX(AutoMutex)とConditionが含まれます。この記事では、それらの使用方法を分析します。具体的な実装については、「 Android でのMUTEX の実装とスレッド同期の条件」および「 MUTEXの使用とpthreadの条件」を参照してください。
キーワード:Mutex、条件変数、AutoLock / AutoMutex、Androidキーワード:Mutex、条件変数
、Auto Lock / Auto Mutex、Android
MUTEXの外部インターフェイス定義を見てください(frameworks / native / include / utils / Mutex.hで宣言されてい
ます) <図1 TODO>
コンストラクターの違いはパラメーターです。-
nameはMUTEXの名前を指定し、指定されていない場合、デフォルトはNULLです。-
typeはMUTEXのタイプを指定し ます。
指定しない場合、デフォルトのタイプはPRIVATEです。
lock()ロックを取得します。取得された場合は戻り、そうでない場合は一時停止されます 。unlock()はロック
を解放し、
tryLock()は現在のロックを取得できる場合(他のスレッドでは取得できない場合)にロックします。それ以外の場合は直接戻ります。戻り値:0は成功を意味し、他の値は失敗します。lock()との違いは、サスペンドして待機するのではなく、成功または失敗に関係なく時間内に戻ることです。
スレッドは、MUTEXで保護されたクリティカルエリアに入る前に、lock()を介してロックを取得します。ロックを取得した後、クリティカルエリアのコードを実行し、クリティカルエリアを出た後、ロックを解除してロックを解除します。
ある時点で最大1つのスレッドがクリティカルエリアで実行されています。スレッドT1がすでに実行されている場合、クリティカルエリアに入りたい他のスレッドT2は中断され、lock()の実行後、スレッドT1がロックを解放するまで待機します。スレッドT2はロックを取得し、実行のために重要なセクションに入ることができます。
lock()/ unlock()は一緒に使用する必要があります。tryLock()は、実行の結果に応じてロックを取得するかどうかに応じて、unlock()を選択するかどうかを選択します。
ます) <図2 TODO>
コンストラクターの違いはtypeパラメーター
です。-typeは指定された条件のタイプです。
指定しない場合、デフォルトのタイプはPRIVATEです。
wait()条件変数(条件変数)
Mutexをパラメーターとして待機し ます。この関数を呼び出す前に、MUTEXをロックする必要があります。
この関数を実行すると、MUTEXのロックが解除され、条件変数が待機します。条件変数を取得できない場合は一時停止して待機し、条件変数を取得した場合はMUTEXを再ロックして返却します。これらの操作はすべてアトミック操作です。
関数の実行後、Mutexは再ロックされるため、関数の実行後、Mutexのロック解除操作が必要です。
waitRelative()とwait()の違いは、待機タイムアウト期間があり、時間に達すると条件変数が返されることです。結果は戻り値で判断できます。
signal()およびbroadcast()トリガー条件変数(条件変数)
signal()とbroadcast() の違いは、signal()は条件変数の取得を待機している1つのスレッドのみを許可し、broadcast()は条件変数を待機しているすべてのスレッドを許可することです。取得して実行を続行します。
また、signal()とbroadcast()を実行する前にミューテックスをロックし、実行後にミューテックスのロックを解除する必要があります。
スレッドT2が実行されます。
使用法は非常に簡単です。ローカルの一時的なAutoMutex変数を定義します。変数が定義されている場所で、コンストラクターが自動的に呼び出され、Mutexのlock()操作が実行されます。変数スコープの最後で、デストラクタが自動的に呼び出されます。 、Mutexのロック解除操作を実行します。
したがって、Mutex保護が必要な領域の先頭にAutoMutex変数を定義し、Mutexを使用して領域を保護することができます。
2013-08-10
Androidによってパッケージ化された同期クラスには、主にMUTEX(AutoMutex)とConditionが含まれます。この記事では、それらの使用方法を分析します。具体的な実装については、「 Android でのMUTEX の実装とスレッド同期の条件」および「 MUTEXの使用とpthreadの条件」を参照してください。
キーワード:Mutex、条件変数、AutoLock / AutoMutex、Androidキーワード:Mutex、条件変数
、Auto Lock / Auto Mutex、Android
1つ、MUTEX
MUTEXの外部インターフェイス定義を見てください(frameworks / native / include / utils / Mutex.hで宣言されてい
ます) <図1 TODO>
1.1建設/破壊
Mutex();
Mutex(const char* name);
Mutex(int type, const char* name = NULL);
~Mutex();
コンストラクターの違いはパラメーターです。-
nameはMUTEXの名前を指定し、指定されていない場合、デフォルトはNULLです。-
typeはMUTEXのタイプを指定し ます。
enum {
PRIVATE = 0,
SHARED = 1
};
2つのタイプ:PRIVATEはプロセス内で使用されます。SHAREDはプロセス間の共有に適しています。
指定しない場合、デフォルトのタイプはPRIVATEです。
1.2機能機能
MUTEXには、次の3つの主要な機能があります。 status_t lock();
void unlock();
status_t tryLock();
lock()ロックを取得します。取得された場合は戻り、そうでない場合は一時停止されます 。unlock()はロック
を解放し、
tryLock()は現在のロックを取得できる場合(他のスレッドでは取得できない場合)にロックします。それ以外の場合は直接戻ります。戻り値:0は成功を意味し、他の値は失敗します。lock()との違いは、サスペンドして待機するのではなく、成功または失敗に関係なく時間内に戻ることです。
スレッドは、MUTEXで保護されたクリティカルエリアに入る前に、lock()を介してロックを取得します。ロックを取得した後、クリティカルエリアのコードを実行し、クリティカルエリアを出た後、ロックを解除してロックを解除します。
ある時点で最大1つのスレッドがクリティカルエリアで実行されています。スレッドT1がすでに実行されている場合、クリティカルエリアに入りたい他のスレッドT2は中断され、lock()の実行後、スレッドT1がロックを解放するまで待機します。スレッドT2はロックを取得し、実行のために重要なセクションに入ることができます。
lock()/ unlock()は一緒に使用する必要があります。tryLock()は、実行の結果に応じてロックを取得するかどうかに応じて、unlock()を選択するかどうかを選択します。
1.3典型的なシナリオ
m_mutex.lock();
// CRITICAL AREA,需要保护的内容
m_mutex.unlock();
二、状態
条件の外部インターフェース定義を見てください(frameworks / native / include / utils / Condition.hで宣言されています) <図2 TODO>
2.1建設/破壊
Condition();
Condition(int type);
~Condition();
コンストラクターの違いはtypeパラメーター
です。-typeは指定された条件のタイプです。
enum {
PRIVATE = 0,
SHARED = 1
};
2つのタイプ:PRIVATEはプロセス内で使用されます。SHAREDはプロセス間の共有に適しています。
指定しない場合、デフォルトのタイプはPRIVATEです。
2.2機能機能
条件には、次の4つの主な機能があります。 status_t wait(Mutex& mutex);
status_t waitRelative(Mutex& mutex, nsecs_t reltime);
void signal();
void broadcast();
wait()条件変数(条件変数)
Mutexをパラメーターとして待機し ます。この関数を呼び出す前に、MUTEXをロックする必要があります。
この関数を実行すると、MUTEXのロックが解除され、条件変数が待機します。条件変数を取得できない場合は一時停止して待機し、条件変数を取得した場合はMUTEXを再ロックして返却します。これらの操作はすべてアトミック操作です。
関数の実行後、Mutexは再ロックされるため、関数の実行後、Mutexのロック解除操作が必要です。
waitRelative()とwait()の違いは、待機タイムアウト期間があり、時間に達すると条件変数が返されることです。結果は戻り値で判断できます。
signal()およびbroadcast()トリガー条件変数(条件変数)
signal()とbroadcast() の違いは、signal()は条件変数の取得を待機している1つのスレッドのみを許可し、broadcast()は条件変数を待機しているすべてのスレッドを許可することです。取得して実行を続行します。
また、signal()とbroadcast()を実行する前にミューテックスをロックし、実行後にミューテックスのロックを解除する必要があります。
2.3典型的なシナリオ
スレッドT1の実行:m_mutex.lock();
m_cond.wait(m_mutex);
m_mutex.unlock();
スレッドT1は、条件変数を介して特定の条件が満たされるのを待機しています。
スレッドT2が実行されます。
m_mutex.lock();
m_cond.signal();
m_mutex.unlock();
スレッドT2は条件を満たした後、条件変数を介して条件が満たされたことを通知します。
三、オートロック/オートミュート
Autolockは、Mutexの使用を簡素化するために定義されています。また、Mutexをカプセル化し、c ++の構築および破棄メカニズムを使用するframeworks / native / include / utils /Mutex.hでも定義されています。 Autolock(Mutex& mutex);
Autolock(Mutex* mutex);
~Autolock();
使用法は非常に簡単です。ローカルの一時的なAutoMutex変数を定義します。変数が定義されている場所で、コンストラクターが自動的に呼び出され、Mutexのlock()操作が実行されます。変数スコープの最後で、デストラクタが自動的に呼び出されます。 、Mutexのロック解除操作を実行します。
したがって、Mutex保護が必要な領域の先頭にAutoMutex変数を定義し、Mutexを使用して領域を保護することができます。