青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

大龍的博客

常用鏈接

統計

最新評論

unix---線程同步 --- 轉

寫在前面

 

1.          本文內容對應《UNIX環境高級編程》(第2版)》第11章。

2.          總結了線程同步的三種方法:互斥量、讀寫鎖以及條件變量。

3.          希望本文對您有所幫助,也歡迎您給我提意見和建議。

線程同步是一個老話題了。當多個控制線程共享相同的內存時,需要確保每個線程看到一致的數據視圖。APUE介紹的線程同步方式有:

 


--------------------------------------------------------------------------------

互斥量

 

互斥量(mutex)從本質上說是一把鎖,在訪問共享資源前對互斥量進行加鎖,在訪問完成后釋放互斥量上的鎖?;コ庾兞坑胮thread_mutex_t數據類型來表示,在使用前必須對其進行初始化。對于靜態分配的互斥量,可以把它設置為常量PTHREAD_MUTEX_INITIALIZER。如果動態地分配互斥量,可以通過調用pthread_mutex_init函數進行初始化,并且在釋放內存前需要調用pthread_mutex_destroy。當參數attr置為NULL時,使用默認的屬性初始化互斥量。

#include <pthread.h>

int pthread_mutex_init(pthread_mutex_t *restrict mutex,

                       const pthread_mutexattr_t *restrict attr);

int pthread_mutex_destroy(pthread_mutex_t *mutex);

int pthread_mutex_lock(pthread_mutex_t *mutex);

int pthread_mutex_trylock(pthread_mutex_t *mutex);

int pthread_mutex_unlock(pthread_mutex_t *mutex);

                                         All return: 0 if OK, error number on failure
 

對互斥量加鎖需要調用pthread_mutex_lock,如果互斥量已經上鎖,調用線程將阻塞直到互斥量被解鎖。對互斥量解鎖,需要調用pthread_mutex_unlock。如果線程不希望被阻塞,它可以使用pthread_mutex_trylock嘗試對互斥量進行加鎖。如果調用pthread_mutex_trylock時互斥量處于未鎖住狀態,那么pthread_mutex_trylock將鎖住互斥量,不會出現阻塞并返回0,否則pthread_mutex_trylock就會失敗,不能鎖住互斥量,而返回EBUSY。

如果線程試圖對同一個互斥量加鎖兩次,那么它自身就會陷入死鎖狀態??梢酝ㄟ^小心地控制互斥量加鎖的順序來避免死鎖的發生。只有一個線程試圖以與另一個線程相反的順序鎖住互斥量時,才可能出現死鎖。如果無法控制互斥量加鎖的順序,可以在試圖加鎖時,先釋放占有的鎖,然后過段時間再試。

 


--------------------------------------------------------------------------------

讀寫鎖

 

讀寫鎖與互斥量類似,不過讀寫鎖允許更高的并行性。讀寫鎖可以有三種狀態:讀模式下加鎖狀態,寫模式下加鎖狀態,以及不加鎖狀態。一次只有一個線程可以占有寫模式的讀寫鎖,但是多個線程可以同時占有讀模式的讀寫鎖。因此,讀寫鎖也叫做共享-獨占鎖。讀寫鎖非常適用于對數據結構讀的次數遠大于寫的情況。

         與互斥量一樣,讀寫鎖在使用之前必須初始化,在釋放它們底層的內存前必須銷毀。這通過pthread_rwlock_inti和pthread_rwlock_destroy函數完成。如果希望讀寫鎖有默認的屬性,可以傳一個空指針給attr。要在讀模式下鎖定讀寫鎖,需要調用pthread_rwlock_rdlock;要在寫模式下鎖定讀寫鎖,需要調用pthread_rwlock_wrlock。不管以何種方式鎖住讀寫鎖,都可以調用pthread_rwlock_unlock進行解鎖。如果希望線程不被阻塞,可以調用pthread_rwlock_tryrdlock和pthread_rwlock_trywrlock函數嘗試對讀寫鎖進行加鎖。

#include <pthread.h>

int pthread_rwlock_init(pthread_rwlock_t *restrict rwlock,

                        const pthread_rwlockattr_t *restrict attr);

int pthread_rwlock_destroy(pthread_rwlock_t *rwlock);

int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_unlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_tryrdlock(pthread_rwlock_t *rwlock);

int pthread_rwlock_trywrlock(pthread_rwlock_t *rwlock);

                                         All return: 0 if OK, error number on failure
 

 


--------------------------------------------------------------------------------

條件變量

 

條件變量與互斥量一起使用時,允許線程以無競爭的方式等待特定的條件發生。條件本身是由互斥量保護的,線程在改變條件前必須首先鎖住互斥量,且只有在鎖住互斥量以后才能計算條件。條件變量使用之前必須首先進行初始化,pthread_cond_t數據類型代表的條件變量可以用兩種方式初始化。可以把常量PTHREAD_COND_INITIALIZER賦給靜態分配的條件變量,但是如果條件變量是動態分配的,可以使用pthread_cond_init函數進行初始化。在釋放底層的內存空間前,可以使用pthread_mutex_destroy函數對條件變量進行銷毀。除非需要創建一個非默認屬性的條件變量,否則pthread_cond_init函數的attr參數可以設置為NULL。

#include <pthread.h>

int pthread_cond_init(pthread_cond_t *restrict cond,

                      pthread_condattr_t *restrict attr);

int pthread_cond_destroy(pthread_cond_t *cond);                                        

All return: 0 if OK, error number on failure
 

使用pthread_cond_wait等待條件變為真,如果在給定時間內條件不能滿足,那么會生成一個代表出錯碼的返回值。調用者需要把鎖住的互斥量傳給pthread_cond_wait對條件進行保護。函數把調用線程放到等待條件的線程列表上,然后對互斥量解鎖,這兩個操作是原子操作。當pthread_cond_wait返回時,互斥量再次被鎖住。

#include <pthread.h>

int pthread_cond_wait(pthread_cond_t *restrict cond, pthread_mutex_t *restrict mutex);

int pthread_cond_timedwait(pthread_cond_t *restrict cond,

                           pthread_mutex_t *restrict mutex,

                           const struct timespec *restrict timeout);                        

All return: 0 if OK, error number on failure
 

pthread_cond_timedwait函數的工作方式與pthread_cond_wait函數相似。timeout值指定了等待的時間,它通過timespec結構指定。時間值用秒數或者分秒數表示,分秒數的單位是納秒。時間值是一個絕對數而不是相對數??梢允褂胓ettimeofday獲取用timeval結構表示的當前時間,然后把這個時間加上要等待的時間轉換成timespec結構。

struct timespec {

        time_t tv_sec;   /* seconds */

        long   tv_nsec;  /* nanoseconds */

};

 

void maketimeout(struct timespec *tsp, long minutes)

{

        struct timeval now;

        /* get the current time */

        gettimeofday(&now);

        tsp->tv_sec = now.tv_sec;

        tsp->tv_nsec = now.tv_usec * 1000; /* usec to nsec */

        /* add the offset to get timeout value */

        tsp->tv_sec += minutes * 60;

}
 

         如果時間值到了但是條件還沒有出現,pthread_cond_timedwait將重新獲取互斥量,然后返回錯誤ETIMEDOUT。從pthread_cond_wait或者pthread_cond_timedwait調用成功返回時,線程需要重新計算條件,因為其它線程可能已經在運行并改變了條件。

pthread_cond_signal函數將喚醒等待該條件的某個線程,而pthread_cond_broadcast函數將喚醒等待該條件的所有線程。必須注意一定要在改變條件狀態以后再喚醒等待線程。

#include <pthread.h>

int pthread_cond_signal(pthread_cond_t *cond);

int pthread_cond_broadcast(pthread_cond_t *cond);                    

All return: 0 if OK, error number on failure
 

         使用范例如下:

#include <pthread.h>

 

struct msg {

    struct msg *m_next;

    /* ... more stuff here ... */

};

struct msg *workq;

pthread_cond_t qready = PTHREAD_COND_INITIALIZER;   /*初始化條件變量*/

pthread_mutex_t qlock = PTHREAD_MUTEX_INITIALIZER;  /*初始化互斥量*/

 

void process_msg(void)

{

    struct msg *mp;

 

    for (;;) {

        pthread_mutex_lock(&qlock);     /*條件本身由互斥量保護*/

        while (workq == NULL)           /*wait返回后要重新檢查條件*/

            pthread_cond_wait(&qready, &qlock);  /*wait期間釋放互斥量,返回時再次鎖住*/

        mp = workq;

        workq = mp->m_next;

        pthread_mutex_unlock(&qlock);   /*真正釋放互斥量*/

        /* now process the message mp */

    }

}

 

void enqueue_msg(struct msg *mp)

{

    pthread_mutex_lock(&qlock);       /*修改條件前鎖住互斥量*/

    mp->m_next = workq;

    workq = mp;

    pthread_mutex_unlock(&qlock);

pthread_cond_signal(&qready);     /*喚醒等待線程時不需要占有互斥量*/

/*如果希望在wait返回時不用再檢查條件,

就需要在喚醒時占有互斥量*/

}
 


本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/intrepyd/archive/2009/08/20/4467821.aspx

posted on 2010-01-04 15:43 大龍 閱讀(682) 評論(0)  編輯 收藏 引用

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            中国成人黄色视屏| 欧美大香线蕉线伊人久久国产精品| 国产精品久久久久免费a∨| 亚洲一区在线观看视频| 欧美午夜大胆人体| 国产精品午夜在线| 国产亚洲精品bt天堂精选| 国产午夜精品久久久久久免费视| 国产亚洲精久久久久久| 一区二区亚洲精品国产| 亚洲乱码国产乱码精品精天堂| 亚洲午夜电影网| 久久乐国产精品| 日韩亚洲视频在线| 欧美诱惑福利视频| 美女国产一区| 国产免费观看久久| 亚洲精选视频免费看| 欧美亚洲一区| 亚洲国产美国国产综合一区二区| 亚洲精品久久久久中文字幕欢迎你| 亚洲视频一区二区免费在线观看| 欧美伊人久久久久久久久影院| 欧美激情中文不卡| 国产专区综合网| 亚洲深夜福利| 欧美国产91| 欧美一区二区三区免费大片| 欧美精品18+| 在线观看国产一区二区| 亚洲一区免费视频| 亚洲电影视频在线| 欧美主播一区二区三区美女 久久精品人 | 欧美一区二区三区免费看| 免费中文日韩| 国内精品久久久久影院色| 亚洲午夜av| 亚洲国内高清视频| 久久久噜噜噜久久久| 国产精品免费一区二区三区在线观看 | 亚洲欧美电影院| 欧美日韩国产成人在线| 在线日韩av片| 久久久欧美一区二区| 亚洲午夜激情免费视频| 欧美日韩的一区二区| 亚洲日本电影| 欧美激情国产日韩精品一区18| 欧美一区二视频在线免费观看| 国产精品a级| 亚洲一区三区电影在线观看| 久久超碰97人人做人人爱| 亚洲欧美国产视频| 欧美日韩一区二区免费在线观看| 在线观看日韩av| 老司机免费视频一区二区| 亚洲一区二区四区| 国产精品一区一区三区| 欧美一区二区三区四区在线观看| 一区二区精品国产| 国产精品亚洲一区二区三区在线| 午夜精品久久| 欧美一级片一区| 国产性做久久久久久| 欧美在线资源| 久久aⅴ国产紧身牛仔裤| 国产一区二区三区四区在线观看| 久久久精品一区| 久久综合福利| 亚洲九九精品| 一片黄亚洲嫩模| 国产嫩草一区二区三区在线观看| 欧美一区二区三区喷汁尤物| 午夜精品久久久久久99热软件| 国产午夜精品一区理论片飘花| 久久久久久国产精品mv| 久久久精品日韩| 一本色道88久久加勒比精品| 一本色道久久| 国产亚洲午夜| 亚洲经典视频在线观看| 欧美特黄视频| 久热精品视频在线观看| 欧美精品三级日韩久久| 欧美中文字幕在线观看| 另类天堂视频在线观看| 亚洲一区二区影院| 久久久精品动漫| 一区二区三区视频在线观看| 亚洲伊人观看| 亚洲精品偷拍| 小处雏高清一区二区三区| 亚洲电影在线看| 一区二区三区产品免费精品久久75| 国产日韩在线一区| 91久久国产精品91久久性色| 国产欧美日韩综合一区在线播放 | 亚洲精选在线观看| 国产一区日韩欧美| 最新69国产成人精品视频免费| 国产精品久久婷婷六月丁香| 免费一级欧美在线大片| 国产精品videossex久久发布| 欧美成人四级电影| 国产欧美三级| 一区二区冒白浆视频| 亚洲国产欧洲综合997久久| 亚洲字幕一区二区| 一区二区三区.www| 美日韩精品视频| 久久久久久久综合| 国产精品劲爆视频| 99在线精品观看| 亚洲人人精品| 亚洲电影在线观看| 欧美成年人网| 国产午夜精品理论片a级探花| 亚洲激情专区| 91久久亚洲| 免费观看欧美在线视频的网站| 久久精品国内一区二区三区| 欧美视频在线播放| 91久久中文| 夜夜嗨av一区二区三区| 免费亚洲一区| 久热精品在线| **性色生活片久久毛片| 欧美在线亚洲在线| 久久激情视频| 国产一区二区三区在线观看网站| 亚洲一区二区三区精品视频 | 久久久精品动漫| 国产视频一区在线观看一区免费| 一区二区三区欧美在线| 亚洲婷婷综合久久一本伊一区| 欧美精品一区二区久久婷婷| 欧美大片在线观看一区二区| 韩国美女久久| 久久久在线视频| 欧美不卡视频一区发布| 18成人免费观看视频| 久久欧美肥婆一二区| 久久久久国内| 国产一区二区在线免费观看| 亚洲欧洲99久久| 久久久久看片| 亚洲国产精品欧美一二99| 久久国产免费看| 国产啪精品视频| 欧美一区2区三区4区公司二百| 久久精品国产精品 | 国产精品久久久久久av福利软件 | 模特精品在线| 亚洲激情影院| 欧美日韩一区二区精品| 中文欧美字幕免费| 久久久综合香蕉尹人综合网| 在线观看日韩www视频免费| 欧美成人免费网| 亚洲小说区图片区| 六十路精品视频| 正在播放亚洲一区| 国产精品天天看| 久久九九国产精品怡红院| 亚洲激情校园春色| 亚洲欧美一区二区原创| 国产一区二区三区久久悠悠色av | 欧美日韩国产美| 亚洲免费视频网站| 欧美综合二区| 久久精品色图| 亚洲人成人一区二区在线观看| 欧美日韩高清在线| 欧美一区二区日韩| 最新精品在线| 久久精品91久久香蕉加勒比| 亚洲成人在线免费| 欧美午夜电影网| 蜜臀av性久久久久蜜臀aⅴ四虎 | 亚洲一区二区三区精品在线观看| 免费h精品视频在线播放| 日韩亚洲精品在线| 国外视频精品毛片| 欧美日韩一区在线观看视频| 久久久久天天天天| 亚洲欧美视频在线观看| 亚洲国产一区二区三区在线播| 久久国产精品99国产| 中文网丁香综合网| 亚洲精品一区在线观看香蕉| 国产一区在线看| 国产精品久久久久久久久久尿 | 欧美电影免费| 久热精品视频在线观看一区| 亚洲欧美日韩精品一区二区| 日韩一级裸体免费视频| 亚洲福利视频一区| 免费亚洲一区| 久久亚洲精品一区| 久久久久免费|