<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關(guān)注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks

    互斥鎖

    盡管在Posix Thread中同樣可以使用IPC的信號量機制來實現(xiàn)互斥鎖mutex功能,但顯然semphore的功能過于強大了,在Posix Thread中定義了另外一套專門用于線程同步的mutex函數(shù)。

    1. 創(chuàng)建和銷毀

    有兩種方法創(chuàng)建互斥鎖,靜態(tài)方式和動態(tài)方式。POSIX定義了一個宏P(guān)THREAD_MUTEX_INITIALIZER來靜態(tài)初始化互斥鎖,方法如下: pthread_mutex_t mutex=PTHREAD_MUTEX_INITIALIZER; 在LinuxThreads實現(xiàn)中,pthread_mutex_t是一個結(jié)構(gòu),而PTHREAD_MUTEX_INITIALIZER則是一個結(jié)構(gòu)常量。

    動態(tài)方式是采用pthread_mutex_init()函數(shù)來初始化互斥鎖,API定義如下: int pthread_mutex_init(pthread_mutex_t *mutex, const pthread_mutexattr_t *mutexattr) 其中mutexattr用于指定互斥鎖屬性(見下),如果為NULL則使用缺省屬性。

    pthread_mutex_destroy()用于注銷一個互斥鎖,API定義如下: int pthread_mutex_destroy(pthread_mutex_t *mutex) 銷毀一個互斥鎖即意味著釋放它所占用的資源,且要求鎖當前處于開放狀態(tài)。由于在Linux中,互斥鎖并不占用任何資源,因此LinuxThreads中的pthread_mutex_destroy()除了檢查鎖狀態(tài)以外(鎖定狀態(tài)則返回EBUSY)沒有其他動作。

    2. 互斥鎖屬性

    互斥鎖的屬性在創(chuàng)建鎖的時候指定,在LinuxThreads實現(xiàn)中僅有一個鎖類型屬性,不同的鎖類型在試圖對一個已經(jīng)被鎖定的互斥鎖加鎖時表現(xiàn)不同。當前(glibc2.2.3,linuxthreads0.9)有四個值可供選擇:

    • PTHREAD_MUTEX_TIMED_NP,這是缺省值,也就是普通鎖。當一個線程加鎖以后,其余請求鎖的線程將形成一個等待隊列,并在解鎖后按優(yōu)先級獲得鎖。這種鎖策略保證了資源分配的公平性。
    • PTHREAD_MUTEX_RECURSIVE_NP,嵌套鎖,允許同一個線程對同一個鎖成功獲得多次,并通過多次unlock解鎖。如果是不同線程請求,則在加鎖線程解鎖時重新競爭。
    • PTHREAD_MUTEX_ERRORCHECK_NP,檢錯鎖,如果同一個線程請求同一個鎖,則返回EDEADLK,否則與PTHREAD_MUTEX_TIMED_NP類型動作相同。這樣就保證當不允許多次加鎖時不會出現(xiàn)最簡單情況下的死鎖。
    • PTHREAD_MUTEX_ADAPTIVE_NP,適應(yīng)鎖,動作最簡單的鎖類型,僅等待解鎖后重新競爭。

    3. 鎖操作

    鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試加鎖pthread_mutex_trylock()三個,不論哪種類型的鎖,都不可能被兩個不同的線程同時得到,而必須等待解鎖。對于普通鎖和適應(yīng)鎖類型,解鎖者可以是同進程內(nèi)任何線程;而檢錯鎖則必須由加鎖者解鎖才有效,否則返回EPERM;對于嵌套鎖,文檔和實現(xiàn)要求必須由加鎖者解鎖,但實驗結(jié)果表明并沒有這種限制,這個不同目前還沒有得到解釋。在同一進程中的線程,如果加鎖后沒有解鎖,則任何其他線程都無法再獲得鎖。

    												
    														int pthread_mutex_lock(pthread_mutex_t *mutex)
    int pthread_mutex_unlock(pthread_mutex_t *mutex)
    int pthread_mutex_trylock(pthread_mutex_t *mutex)
    												
    										

    pthread_mutex_trylock()語義與pthread_mutex_lock()類似,不同的是在鎖已經(jīng)被占據(jù)時返回EBUSY而不是掛起等待。

    4. 其他

    POSIX線程鎖機制的Linux實現(xiàn)都不是取消點,因此,延遲取消類型的線程不會因收到取消信號而離開加鎖等待。值得注意的是,如果線程在加鎖后解鎖前被取消,鎖將永遠保持鎖定狀態(tài),因此如果在關(guān)鍵區(qū)段內(nèi)有取消點存在,或者設(shè)置了異步取消類型,則必須在退出回調(diào)函數(shù)中解鎖。

    這個鎖機制同時也不是異步信號安全的,也就是說,不應(yīng)該在信號處理過程中使用互斥鎖,否則容易造成死鎖。

    posted on 2007-01-27 21:18 allic 閱讀(779) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導航:
     
    主站蜘蛛池模板: 亚洲日韩中文字幕天堂不卡| 亚洲国产精品嫩草影院| 国产在线观看免费观看不卡| 亚洲av无码一区二区三区四区| 亚洲精品无码专区2| 久久青草免费91线频观看不卡 | 亚洲日韩国产精品无码av| 大学生a级毛片免费观看| 一区二区三区视频免费观看| 亚洲精品不卡视频| 免费夜色污私人影院在线观看| 久久99毛片免费观看不卡| 亚洲粉嫩美白在线| 亚洲av中文无码乱人伦在线r▽ | 亚洲自偷自偷精品| 国产国产人免费人成免费视频| 国产免费爽爽视频在线观看 | 国产AV无码专区亚洲精品| 亚洲欧洲免费无码| 三级黄色在线免费观看| 亚洲综合无码一区二区痴汉| 亚洲免费观看视频| 日韩电影免费在线观看视频| 一级毛片免费不卡在线| 国产精品免费看久久久香蕉| 国产成人精品日本亚洲专区6| 亚洲日韩精品无码专区网址| 精品免费久久久久久成人影院| 久爱免费观看在线网站| 农村寡妇一级毛片免费看视频| 亚洲一区中文字幕在线观看| 久久国产亚洲电影天堂| 亚洲精品456播放| 在线观看免费毛片| 久久精品国产免费观看三人同眠| 国产免费MV大全视频网站| 欧美亚洲国产SUV| 自拍偷区亚洲国内自拍| 亚洲精品一卡2卡3卡三卡四卡| 亚洲成亚洲乱码一二三四区软件| 亚洲另类激情专区小说图片|