AndroidでのMutexの使用法とスレッド同期の条件

Haili Tian
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を使用して領域を保護することができます。

4、まとめ

この記事では、Androidで一般的に使用されるMutex(AutoMutex)とConditionの同期メカニズムの使用について簡単に紹介します。フォローアップ記事(「 Android でのMUTEX の実装スレッド同期の条件」および「 MUTEXの使用法とpthreadの条件」)では、それらがどのように実装されているかを確認できます。


おすすめ

転載: blog.csdn.net/thl789/article/details/9879151