1. 程式人生 > >mutex和condition的用法

mutex和condition的用法

分享一下DTCP-IP中用到的mutexcondition用法。

Mutex一般有兩種使用情況,一種是單獨使用,保護臨界區。

一種是和condition配合使用,可以等待某condition拿到之後再向下走。

Condition 有兩種signal形式, single  broadcast,下面例子是signal的,

做個參考。

pthread_cond_t ake_cond  = PTHREAD_COND_INITIALIZER;

pthread_mutex_t ake_mutex = PTHREAD_MUTEX_INITIALIZER;

thread 1: 等待AKE完成的signal

pthread_mutex_lock(&ake_mutex);

if (DTCP_AKE_STATE_GOT_EXCHANGE_KEY !=DTCP_AKE_Get_Current_State()) {

                              pthread_cond_wait(&ake_cond, &ake_mutex);

 //進入wait狀態之後, ake_mutex會處於unlock狀態;

                               //等待拿到ake_cond後,,  ake_mutex會變為lock狀態;

pthread_cond_wait

有多種用法,還有一種pthread_cond_wait timeout功能,

可以等待condition某段時間之後如果還拿不到則向下執行,我上次使用有些問題,有興趣用到時候可以研究下。

}

pthread_mutex_unlock(&ake_mutex);

thread 2:  AKE完成之後傳送signal

void DTCP_Decrypt_AKE_Finish_Callback(void){

                               DTCPLOGV(DECRYPTTAG, "[%s: %d] enter", __FUNCTION__, __LINE__);

                               pthread_mutex_lock(&ake_mutex);

                               pthread_cond_signal(&ake_cond);

                               pthread_mutex_unlock(&ake_mutex);               

}

/************************************************/

pthread_cond_timedwait 用法

          pthread_mutex_lock(&mutex);

        clock_gettime(CLOCK_MONOTONIC, &tv);
        outtime.tv_sec = tv.tv_sec;
        outtime.tv_nsec = tv.tv_nsec + 100 * 1000 * 1000;

        if(outtime.tv_nsec > 1000 * 1000 * 1000){
            outtime.tv_sec = outtime.tv_sec + outtime.tv_nsec / (1000 * 1000 * 1000);
            outtime.tv_nsec = outtime.tv_nsec % (1000*1000*1000);
        }

        int result = pthread_cond_timedwait(&(pMPthread->m_cond), &mutex, &outtime);
        if (result == ETIMEDOUT) {
            //MGR_LOGT << "pthread_cond_timedwait timeout!!!";
        }
 
        pthread_mutex_unlock(&mutex);

    pthread_condattr_init(&m_attr);
    pthread_condattr_setclock(&m_attr, CLOCK_MONOTONIC);
    pthread_cond_init(&m_cond, &m_attr);

Clock_realtime

代表機器上可以理解為當前的我們所常看的時間,其當time-of-day 被修改的時候而改變,這包括NTP對它的修改(NTP:Network Time Protocol(NTP)是用來使計算機時間同步化的一種協議,它可以使計算機對其伺服器或時鐘源(如石英鐘,GPS等等)做同步化,它可以提供高精準度的時間校正(LAN上與標準間差小於1毫秒,WAN上幾十毫秒),且可介由加密確認的方式來防止惡毒的協議攻擊。)
CLOCK_MONOTONIC
代表從過去某個固定的時間點開始的絕對的逝去時間,它不受任何系統time-of-day時鐘修改的影響,如果你想計算出在一臺計算機上不受重啟的影響,兩個事件發生的間隔時間的話,那麼它將是最好的選擇。

更多資料參考:

相關推薦

mutexcondition用法

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

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

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

Android同步類:MutexCondition的使用方式

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

Go基礎系列:互斥鎖Mutex讀寫鎖RWMutex用法詳述

sync.Mutex Go中使用sync.Mutex型別實現mutex(排他鎖、互斥鎖)。在原始碼的sync/mutex.go檔案中,有如下定義: // A Mutex is a mutual exclusion lock. // The zero value for a Mutex is an un

odoo系統中name_searchname_get用法

打印 per sequence not 添加 product xpath ret 領料單 自動帶出工序和工序序號,兩個條件都能搜索,並且兩個都帶出來顯示在前端: # 輸入工序序號會自動帶出工序名// def name_search(self, cr,user,name=

腳本引用中使用deferasync用法區別

兩個 不依賴 doc 體驗 html 中文 htm 停止 其他 是的,就是在頁面腳本引用的時候設置defer或者async,為什麽會有這兩個屬相來輔助腳本加載那,因為瀏覽器在遇到script標簽的時候,文檔的解析會停止,不再構建document,有時打開一個網頁上會出現空

SQLServer中existsexcept用法

sqlserver sql 一、exists1.1 說明EXISTS(包括 NOT EXISTS)子句的返回值是一個BOOL值。EXISTS內部有一個子查詢語句(SELECT ... FROM...),我將其稱為EXIST的內查詢語句。其內查詢語句返回一個結果集。EXISTS子句根據其內查詢語句的結果

chipmunk 物理引擎的基本概念基本用法

num 碰撞回調 2.0 ddb mat sha print 單獨 得出 chipmunk是一個開源2D物理引擎, 項目主頁:http://code.google.com/p/chipmunk-physics/ 工作需要研究了一下,這個引擎的資料還是不多,我閱讀了

mutexCRITICAL_SECTION,互斥臨界區

com 劃分 通用 私人定制 art ica fff ace enter 本文不沒有任何知識可講,只是帖上自己測試的結果。 想看底層原理的可以直接關閉。 不過對於急著要選方案的人,倒提供一些幫助。 先說一些無關緊要的廢話: =========================

Objective-C中的@property@synthesize用法

有時 頭文件 關鍵字 nbsp nsa atomic 所有者 ica 風險 描述 @代表“Objective-C”的標誌,證明您正在使用Objective-C語言。 是Objective-C語言關鍵詞。 @property與@synthesize配對使用。 功能:讓編譯

HashMap、HashTable、LinkedHashMapTreeMap用法區別

strong style 取出 能力 順序 ron public ons 保存 Java為數據結構中的映射定義了一個接口java.util.Map,它有四個實現類,分別是HashMap、HashTable、LinkedHashMap和TreeMap。本節實例主要介紹這4中實

ES6模塊的importexport用法

ron pan console 完全 any 解決方案 例子 異步加載 直觀 ES6之前已經出現了js模塊加載的方案,最主要的是CommonJS和AMD規範。commonjs主要應用於服務器,實現同步加載,如nodejs。AMD規範應用於瀏覽器,如requirejs,為異步

【轉】mysql的SQL_NO_CACHE(在查詢時不使用緩存)sql_cache用法

his let 作用 upd 做了 ble effect table mea 轉自:http://www.169it.com/article/5994930453423417575.html 為了測試sql語句的效率,有時候要不用緩存來查詢。 使用 SELECT SQL

set的特性基本用法——python3.6

技術 card pda 測試 display pla 不能 差集 pytho 特性 無序,不重復的數據組合,用{}表示,eg:{1,2,3,4,5,6} 用途 去重,把一個列表變成集合,就自動去重了 關系測試,測試兩組數據之間的交集,差集,並集,對稱差集,包含

c語言中###的用法

報錯 用法 == 預處理器 tor () name 文件 就是 一、一般用法 我們使用#把宏參數變為一個字符串,用##把兩個宏參數貼合在一起. 用法: #include<cstdio> #include<climits> using namespac

Skype for business企業語音配置之三 路由PSTN用法

國內 voice href 排除 -o 國際 semi wid 圖片 PSTN 用法記錄規劃 PSTN 用法記錄主要任務是列出當前在組織中對所有員工的所有呼叫權限。下表顯示了典型的 PSTN 用法表。PSTN 用法記錄電話屬性描述Local本地電話Long-Distance

setInterval setTimeout 用法

setInterval 和 setTisetInterval 定時器,開始執行後,每間隔指定時間執行一次,除非清除定時器用法: setInterval(function(){ 方法... },1000);// 間隔時間 setTimeout 是在指定的時間後,執行該事件用法: setTimeout(fun

4.2.#{}${}的用法

{} shm poj 預處理 ${} 註入 接受 map ava #{}:相當於預處理中的占位符?。 #{}裏面的參數表示接收java輸入參數的名稱。 #{}可以接受HashMap、簡單類型、POJO類型的參數。 當接受簡單類型的參數時,#{}裏面可以是value,也可以是

THISsupper用法

java this supper class Person{public static void prt(String s){System.out.println(s);}Person(){prt("父類·無參構造方法:"+"A Person。");}//構

前端路由的實現(三) —— History的pushStatereplaceState用法

最終 標簽 -c 歷史記錄 htm 操作 har PE 能夠 HTML5中history提供的pushState, replaceState這兩個API。它們提供了操作瀏覽器歷史棧的方法。 pushState能夠在不加載頁面的情況下改變瀏覽器的URL。這個方法接受三個參數