• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            <2006年9月>
            272829303112
            3456789
            10111213141516
            17181920212223
            24252627282930
            1234567

            統計

            • 隨筆 - 44
            • 文章 - 0
            • 評論 - 86
            • 引用 - 0

            常用鏈接

            留言簿(6)

            隨筆分類(31)

            隨筆檔案(44)

            Mining

            最新隨筆

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            Linux 下的線程讀寫鎖
            有一種寫優先讀寫鎖,有如下特點:
            1)多個讀者可以同時進行讀
            2)寫者必須互斥(只允許一個寫者寫,也不能讀者寫者同時進行)
            3)寫者優先于讀者(一旦有寫者,則后續讀者必須等待,喚醒時優先考慮寫者)

            在Solaris 中直接提供了讀寫鎖, 但是在Linux 中只提供了線程的讀寫鎖, 這里記錄了一些讀寫鎖的資料.

            1.Solaris .vs. Linux Posix 庫函數

            Solaris 庫(lib 線程)Linux POSIX 庫(libp 線程)操作
            sema_destroy()sem_destroy()銷毀信號狀態。
            sema_init()sem_init()初始化信號。
            sema_post()sem_post()增加信號。
            sema_wait()sem_wait()阻止信號計數。
            sema_trywait()sem_trywait()減少信號計數。
            mutex_destroy()pthread_mutex_destroy()銷毀或禁用與互斥對象相關的狀態。
            mutex_init()pthread_mutex_init()初始化互斥變量。
            mutex_lock()pthread_mutex_lock()鎖定互斥對象和塊,直到互斥對象被釋放。
            mutex_unlock()pthread_mutex_unlock()釋放互斥對象。
            cond_broadcast()pthread_cond_broadcast()解除對等待條件變量的所有線程的阻塞。
            cond_destroy()pthread_cond_destroy()銷毀與條件變量相關的任何狀態。
            cond_init()pthread_cond_init()初始化條件變量。
            cond_signal()pthread_cond_signal()解除等待條件變量的下一個線程的阻塞。
            cond_wait()pthread_cond_wait()阻止條件變量,并在最后釋放它。
            rwlock_init()pthread_rwlock_init()初始化讀/寫鎖。
            rwlock_destroy()pthread_rwlock_destroy()鎖定讀/寫鎖。
            rw_rdlock()pthread_rwlock_rdlock()讀取讀/寫鎖上的鎖。
            rw_wrlock()pthread_rwlock_wrlock()寫讀/寫鎖上的鎖。
            rw_unlock()pthread_rwlock_unlock()解除讀/寫鎖。
            rw_tryrdlock()pthread_rwlock_tryrdlock()讀取非阻塞讀/寫鎖上的鎖。
            rw_trywrlock()pthread_rwlock_trywrlock()寫非阻塞讀/寫鎖上的鎖。


            2.使用mutex 來實現

            設置三個互斥信號量:
            rwmutex?? ??? ?用于寫者與其他讀者/寫者互斥的訪問共享數據
            rmutex?? ??? ?用于讀者互斥的訪問讀者計數器readcount
            nrmutex?? ??? ?用于寫者等待已進入讀者退出,所有讀者退出前互斥寫操作

            var?? rwmutex,rmutex,nrmutex:semaphore:=1,1,1; ?
            int?? readcount=0;

            cobegin
            ?? ?reader begin
            ?? ??? ?P(rwmutex);
            ?? ??? ?P(rmutex);
            ?? ??? ?readcount++;
            ?? ??? ?if (readcount == 1) P(nrmutex);? //有讀者進入,互斥寫操作
            ?? ??? ?V(rmutex);
            ?? ??? ?V(rwmutex);? //及時釋放讀寫互斥信號量,允許其它讀、寫進程申請資源讀數據;
            ?? ??? ?
            ?? ??? ?P(rmutex);
            ?? ??? ?readcount--;
            ?? ??? ?if(readcount == 0) V(nrmutex);? //所有讀者退出,允許寫更新
            ?? ??? ?V(rmutex);
            ?? ?End
            ?? ?
            ?? ?writer begin
            ?? ??? ?P(rwmutex);??? //互斥后續其它讀者、寫者
            ?? ??? ?P(nrmutex);??? //如有讀者正在讀,等待所有讀者讀完
            ?? ??? ?寫更新;
            ?? ??? ?V(nrmutex);??? //允許后續新的第一個讀者進入后互斥寫操作 ?
            ?? ??? ?V(rwmutex);??? //允許后續新讀者及其它寫者
            ?? ?End ?
            coend??

            3. 利用pthread_cond_* & pthread_mutex_* 實現rw_lock

            #include?<pthread.h>
            #include?
            <cstdlib>
            #include?
            <ctime>
            #include?
            <iostream>
            using?namespace?std;

            class?RWLock?{

            private?:
            ????pthread_mutex_t?cnt_mutex;
            ????pthread_cond_t?rw_cond;
            ????
            int?rd_cnt,?wr_cnt;

            ????RWLock(
            const?RWLock&);
            ????RWLock
            &?operator=?(const?RWLock&);

            public?:
            ????RWLock():?rd_cnt(
            0),wr_cnt(0)
            ????????{
            ????????????pthread_mutex_init(
            &cnt_mutex,?NULL);
            ????????????pthread_cond_init(
            &rw_cond,?NULL);
            ????????}

            ????
            void?get_shared_lock()
            ????????{
            ????????????pthread_mutex_lock(
            &cnt_mutex);
            ????????????
            while?(wr_cnt?>0)
            ????????????????{
            ????????????????????pthread_cond_wait(
            &rw_cond,&cnt_mutex);
            ????????????????}
            ????????????rd_cnt
            ++;
            ????????????pthread_mutex_unlock(
            &cnt_mutex);
            ????????}

            ????
            void?release_shared_lock()
            ????????{
            ????????????pthread_mutex_lock(
            &cnt_mutex);
            ????????????rd_cnt
            --;
            ????????????
            if?(0?==?rd_cnt)
            ????????????????{
            ????????????????????pthread_cond_signal(
            &rw_cond);
            ????????????????}
            ????????????pthread_mutex_unlock(
            &cnt_mutex);
            ????????}

            ????
            void?get_exclusive_lock()
            ????????{
            ????????????pthread_mutex_lock(
            &cnt_mutex);
            ????????????
            while?(rd_cnt+wr_cnt>0)
            ????????????????{
            ????????????????????pthread_cond_wait(
            &rw_cond,&cnt_mutex);
            ????????????????}
            ????????????wr_cnt
            ++;
            ????????????pthread_mutex_unlock(
            &cnt_mutex);
            ????????}

            ????
            void?release_exclusive_lock()
            ????????{
            ????????????pthread_mutex_lock(
            &cnt_mutex);
            ????????????wr_cnt
            --;
            ????????????pthread_cond_broadcast(
            &rw_cond);
            ????????????pthread_mutex_unlock(
            &cnt_mutex);
            ????????}

            ????
            ~RWLock()
            ????????{
            ????????????pthread_mutex_destroy(
            &cnt_mutex);
            ????????????pthread_cond_destroy(
            &rw_cond);
            ????????}
            };

            class?Test
            {

            private?:????
            ????RWLock?
            lock;
            ????
            ????
            static?void*?shared_task_handler(void*?arg)
            ????????{
            ????????????Test
            *?testptr?=?static_cast<Test*>(arg);

            ????????????testptr
            ->lock.get_shared_lock();
            ????????????
            //do?the?shared?task?here
            ????????????testptr->lock.release_shared_lock();
            ????????}


            ????
            static?void?*?exclusive_task_handler(void?*?arg)
            ????????{
            ????????????Test
            *?testptr?=?static_cast<Test*>(arg);
            ????????????testptr
            ->lock.get_exclusive_lock();
            ????????????
            //do?the?exclusive?task?here
            ????????????testptr->lock.release_exclusive_lock();
            ????????}

            public?:
            ????typedef?
            void*?(*ThreadFunc)?(void*);

            ????
            void?start()
            ????????{
            ????????????srand(time(NULL));

            ????????????
            const?int?THREADS_NO=rand()%100;
            ????????????pthread_t
            *?threads?=?new?pthread_t[THREADS_NO];

            ????????????
            for(int?i=0;?i<THREADS_NO;?i++)
            ????????????????{
            ????????????????????ThreadFunc?tmpfunc?
            =?rand()%2??shared_task_handler?:?exclusive_task_handler;
            ????????????????????
            if?(pthread_create(threads+i,NULL,tmpfunc,this))
            ????????????????????????{
            ????????????????????????????cerr?
            <<?"pthread_create?fails"?<<?endl;
            ????????????????????????????exit(
            1);
            ????????????????????????}
            ????????????????}

            ????????????
            for(int?i=0;?i<THREADS_NO;?i++)
            ????????????????{
            ????????????????????pthread_join(threads[i],NULL);
            ????????????????}

            ????????????delete[]?threads;
            ????????}
            };

            int?main()
            {
            ????Test?tmptest;
            ????tmptest.start();
            }

            --------------------------
            參考:
            Solaris 執行緒與同步機制之實例
            Posix線程編程指南

            posted on 2006-09-07 19:12 泡泡牛 閱讀(8933) 評論(0)  編輯 收藏 引用

            久久综合日本熟妇| 精产国品久久一二三产区区别| 久久久精品人妻一区二区三区蜜桃 | 久久精品水蜜桃av综合天堂| 亚洲综合久久夜AV | 无码人妻少妇久久中文字幕 | 日韩亚洲国产综合久久久| 久久91精品国产91久久麻豆| 精品久久久久久无码专区不卡| 亚洲狠狠婷婷综合久久蜜芽| 久久精品国产亚洲AV蜜臀色欲| 欧美黑人激情性久久| 亚洲精品视频久久久| 亚洲欧美一区二区三区久久| 亚洲国产综合久久天堂 | 久久国语露脸国产精品电影| 久久人人爽人人人人爽AV | 亚洲成色www久久网站夜月| 奇米影视7777久久精品| 国产精品无码久久久久久| 97r久久精品国产99国产精| 久久久精品免费国产四虎| 国产69精品久久久久9999| 99久久婷婷国产一区二区| 人人狠狠综合久久亚洲| 久久久午夜精品福利内容| 国产精品99久久久精品无码| 久久精品水蜜桃av综合天堂| 99久久精品九九亚洲精品| 午夜精品久久久久久影视777| 久久婷婷五月综合97色直播| 久久久久亚洲精品无码蜜桃| 久久99精品国产99久久| 欧美久久天天综合香蕉伊| 亚洲日韩中文无码久久| 91精品国产高清91久久久久久| 国产综合精品久久亚洲| 99久久国产精品免费一区二区| 成人国内精品久久久久影院| 欧美国产精品久久高清| 久久精品午夜一区二区福利|