• <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>
            <2008年10月>
            2829301234
            567891011
            12131415161718
            19202122232425
            2627282930311
            2345678

            統計

            • 隨筆 - 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 泡泡牛 閱讀(8939) 評論(0)  編輯 收藏 引用

            亚洲国产成人久久笫一页| 久久精品国产99久久久| 69久久精品无码一区二区| 久久国产高潮流白浆免费观看| 久久青青草原亚洲av无码app| 国产一级做a爰片久久毛片| 国产福利电影一区二区三区久久老子无码午夜伦不 | 色婷婷综合久久久久中文| 国产成人精品免费久久久久| 欧美亚洲另类久久综合| 性做久久久久久久久浪潮| 久久人爽人人爽人人片AV| 久久久无码精品午夜| 久久夜色精品国产欧美乱| 国产精品激情综合久久| 午夜久久久久久禁播电影| 精品久久久久久无码人妻蜜桃| 精品国产乱码久久久久久呢 | 精品久久人人做人人爽综合| 无码日韩人妻精品久久蜜桃| 国内精品久久久久久中文字幕 | 久久精品人人做人人爽97| 色诱久久av| 精品久久久久久国产牛牛app | 老司机午夜网站国内精品久久久久久久久| 亚洲va久久久噜噜噜久久| 久久久久无码国产精品不卡| 97超级碰碰碰碰久久久久| av国内精品久久久久影院| 亚洲午夜久久久久久久久久| 亚洲国产成人久久一区WWW| 久久99热这里只有精品国产| 亚洲综合精品香蕉久久网97 | 亚洲成av人片不卡无码久久| 久久99国产一区二区三区| 国产午夜精品理论片久久影视| 久久精品国产第一区二区三区| 国产精品9999久久久久| 狠狠色丁香婷婷久久综合不卡| 国产精品久久久久久福利漫画| 91精品国产高清久久久久久io|