1. 程式人生 > >Android同步類:Mutex和Condition的使用方式

Android同步類:Mutex和Condition的使用方式

Metux類

Mutex是互斥類,多個執行緒訪問同一個資源時,要確保他們的互斥。主要函式有
lock(),unlock(),trylock()

函式名 作用
lock() 當使用lock函式時,當前的執行緒就會lock住;如果有執行緒已經鎖住,lock()則會等待直到成功為止,系統只允許有一個執行緒被lock住
unlock() 該函式可以釋放執行緒
trylock() 該函式嘗試去鎖程序,通過返回值可以判斷是否能lock住

以下是Mutex的原始碼

inline Mutex::Mutex(int type, const
char* name) {
if (type == SHARED) { //type如果是SHARED,則表明這個Mutex支援跨程序的執行緒同步。 pthread_mutexattr_t attr; pthread_mutexattr_init(&attr); pthread_mutexattr_setpshared(&attr, PTHREAD_PROCESS_SHARED); pthread_mutex_init(&mMutex, &attr); pthread_mutexattr_destroy(&attr); } else
{ pthread_mutex_init(&mMutex, NULL); } } inline Mutex::~Mutex() { pthread_mutex_destroy(&mMutex); } inline status_t Mutex::lock() { return -pthread_mutex_lock(&mMutex); } inline void Mutex::unlock() { pthread_mutex_unlock(&mMutex); } inline status_t Mutex::tryLock() { return
-pthread_mutex_trylock(&mMutex); }

AutoLock類

AutoLock類是Mutex的一個內部類,是為了方便使用Mutex而產生的。
在Mutex中,lock和unlock是必須成對出現的,但是當代碼很複雜時,則會出現遺漏的現象。
利用構造和解構函式的性質,可以方便地讓lock和unlock成對出現。
當需要使用lock函式時,構造一個AutoLock類,執行緒結束後該類析構,則相當於unlock,這樣避免了發生lock和unlock不匹配的情況。

以下是Autolock的原始碼

class Autolock {
    public:
        //構造的時候呼叫lock。
        inline Autolock(Mutex& mutex) : mLock(mutex)  { mLock.lock(); }
        inline Autolock(Mutex* mutex) : mLock(*mutex) { mLock.lock(); }
        //析構的時候呼叫unlock。
        inline ~Autolock() { mLock.unlock(); }
    private:
        Mutex& mLock;
    };

Condition類

執行緒B或者C在執行前,必須有一個A執行緒的初始化,即A是一個條件,Condition則是用在這樣的一種場景中,並且Condition和Mutex是配合使用的,Condition的函式都必須放在Mutex的lock和unlock之間。

函式名 作用
wait(Mutex& mutex) 執行緒B和C等待事件
waitRelative(Mutex& mutex, nsecs_t reltime) 執行緒B和C的超時等待,B和C可以指定等待時間,當超過這個時間,條件卻還不滿足,則退出等待。
signal() 觸發者A用來通知條件已經滿足,但是B和C只有一個會被喚醒。
broadcast() 觸發者A用來通知條件已經滿足,所有等待者都會被喚醒。(廣播)

以下是Condition的原始碼

class Condition {
public:
    enum {
        PRIVATE = 0,
        SHARED = 1
    };


    Condition();
    Condition(int type);//如果type是SHARED,表示支援跨程序的條件同步
    ~Condition();

    status_t wait(Mutex& mutex);

    status_t waitRelative(Mutex& mutex, nsecs_t reltime);

    void signal();

    void broadcast();


private:
#if defined(HAVE_PTHREADS)
    pthread_cond_t mCond;
#else
    void*   mState;
#endif
}

相關推薦

Android同步MutexCondition的使用方式

Metux類 Mutex是互斥類,多個執行緒訪問同一個資源時,要確保他們的互斥。主要函式有 lock(),unlock(),trylock() 函式名 作用 lock() 當使用lock函式時,當前的執行緒就會lock住;如

從零開始構建一個Reactor模式的網路庫(一) 執行緒同步MutexCondition

最近在學習陳碩大神的muduo庫,感覺寫的很專業,以及有一些比較“高階”的技巧和設計方式,自己寫會比較困難。 於是打算自己寫一個簡化版本的Reactor模式網路庫,就取名叫mini吧,同樣只基於Linux平臺,不使用boost庫,去掉一些比較複雜的部分,只實現比較基本的功能。 寫作的過程中,參考了http

SQL Server統計信息問題解決方式

二次 就會 數據庫引擎 目的 獲得 差異 product primary tex 在網上看到一篇介紹使用統計信息出現的問題已經解決方式,感覺寫的很全面。在自己看的過程中順便做了翻譯。因為本人英文水平有限,可能中間有一些錯誤。假設有哪裏有問題歡迎大家批評指正。建議英文

Android 簡單案例onSaveInstanceState onRestoreInstanceState

ted bsp raw hand current div set for hot import android.app.Activity; import android.os.Bundle; import android.view.View; import android

JAVA中常用IO流FileInputStreamFileOutputStream

table string [] 文件中 讀取 描述符 off fis 系統資源 FileInputStream 用於讀取本地文件中的字節數據,繼承自InputStream類 構造方法摘要 FileInputStream(File file) 通

Java Web主動被動方式檢測安全的框架

一個 mapping web 安全 xls .config 負責 per .net bsp 對於某些敏感的系統例如支付、交易需要為其加固,有必要將可能的攻擊情況考慮進來加以防範,於是有了這麽一個簡易的安全框架。在前輩的代碼上( 詳見 :http://blog.csdn.ne

010 有順序的Map的實現TreeMapLinkedHashMap

隨機 子類 hashcode col 線程 tab www. 多個 最好 作者:nnngu GitHub:https://github.com/nnngu 博客園:http://www.cnblogs.com/nnngu 簡書:https://www.jianshu.com

繼承-5-繼承方式

#include <iostream> // class A { public://訪問許可權 int a; protected://訪問許可權 int b; private://訪問許可權 int c; }; //繼承方式 public繼承 protected繼承

Android 動畫的特點區別

DVM指dalivk的虛擬機器。每一個Android應用程式都在它自己的程序中執行,都擁有一個獨立的Dalvik虛擬機器例項。而每一個DVM都是在Linux中的一個程序,所以說可以認為是同一個概念。  1、sim卡的EF檔案有何作用。 sim卡的檔案系統有自己規範,主要是

集合ListSet比較,各自的子比較(ArrayList,Vector,LinkedList;HashSet,TreeSet)

ArrayList,LinkedList,Vector都屬於List List:元素是有順序的,元素可以重複因為每個元素有自己的角標(索引)   |-- ArrayList:底層的資料結構是陣列結構,特點是:查詢很快,增 刪 稍微慢點,執行緒不同步   |-- Linke

android小知識ArrayList陣列之間的轉換

List----->陣列開發中不免碰到List與陣列型別之間的相互轉換,舉一個簡單的例子: package test.test1; import java.util.ArrayList; import java.util.List; public class Test { /** * @param ar

四、Struts2的多種Action的寫法訪問方式

Action類的三種寫法 1.簡單的Java類 沒有任何繼承和實現,例如: package blog.csdn.net.mchenys; public class HelloAction { /** * 方法許可權必須public * 返回值必須String型別

JAVA中常用IO流BufferedReaderBufferedWriter

 BufferedReader類用於緩衝讀取字元,將位元組流封裝成BufferedReader物件,然後用readLine()逐行讀入字元流,直到遇到換行符為止(相當於反覆呼叫Reader類物件的read()方法讀入多個字元) 下面摘抄自JAVA API文件 publ

Threadrunstart方法的區別

run和start方法,有時候會被當成起一個新的執行緒執行程式碼邏輯,來達到程式非同步執行的效果。(1)程式呼叫run方法:public class ExtendThread extends Thread{@Overridepublic void run() {// TODO

Android工具獲取手機的資料夾及檔案列表

效果圖: package wuwang.tools.utils; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import ja

mutexcondition的用法

分享一下DTCP-IP中用到的mutex和condition用法。 Mutex一般有兩種使用情況,一種是單獨使用,保護臨界區。 一種是和condition配合使用,可以等待某condition拿到之後再向下走。 Condition 有兩種signal形式, single和

Android CPU使用率topdump cpuinfo的不同

CPU是系統非常重要的資源,在Android中,檢視CPU使用情況,可以使用top命令和dump cpuinfo。我記得很久以前,就發現這兩者存在不同,初步猜測應該是演算法上存在差異。最近需要採集應用CPU的使用率,看了一下兩種CPU的計算方法。 1、top top是比較經典的CPU計算方法,top的程式碼

檢視Android系統的原始碼 線上離線方式 及閱讀工具

前言     不管是做Android底層(Framework-Linux-驅動)開發,還是做APP開發,對於Android的某一個功能,某一個機制,或者某一個API,它到底是如何實現的,需要 Re

工具時間日期的獲取

public class DateUtil { public static final String DATE_FORMAT = "yyyy-MM-dd"; private static SimpleDateFormat sdf = new SimpleDa

檔案對話方塊CFileDialog開啟儲存

1.新建一個基於對話方塊的MFC工程 2.新增一個“Bottom”和“Edit Control”, 修改對應的ID為IDC_OPEN_BOTTOM,iDC_OPEN_EDIT。 3.雙擊Bottom”開啟“,編輯對應的訊息處理函式 void CO