• <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>
            <2007年11月>
            28293031123
            45678910
            11121314151617
            18192021222324
            2526272829301
            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久久精品免费看国产一区二区三区 | 久久免费视频观看| 久久久噜噜噜久久熟女AA片| 精品国产一区二区三区久久久狼| 久久精品国产99久久久古代 | 国产精品久久毛片完整版| 久久综合给合综合久久| 久久久久久久97| 久久国产精品一区| 青青草原综合久久大伊人| 精品国产一区二区三区久久| 亚洲精品tv久久久久久久久久| 久久成人国产精品| 久久亚洲国产精品成人AV秋霞| 99久久国产热无码精品免费久久久久| 久久久久久曰本AV免费免费| 国产午夜精品久久久久九九电影| 漂亮人妻被中出中文字幕久久 | 一本一本久久a久久精品综合麻豆| 久久影院综合精品| 一本一道久久a久久精品综合 | 久久综合九色综合欧美就去吻| 精品国产乱码久久久久久1区2区| 欧美激情精品久久久久久久九九九 | 性欧美大战久久久久久久久| 国产成人综合久久精品尤物| 精品一二三区久久aaa片| 亚洲国产日韩欧美久久| 久久综合久久鬼色| 国产精品免费久久| 久久国产一片免费观看| 国产激情久久久久影院老熟女| 亚洲欧美日韩精品久久| 国产精品九九九久久九九| 国产精品久久久久天天影视 | 精品久久久久久无码国产| 久久精品国产福利国产秒| 狠狠狠色丁香婷婷综合久久五月 | 久久香蕉一级毛片| 成人午夜精品久久久久久久小说| 精品国产乱码久久久久久1区2区|