久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

Hi,歡迎來到嵌入式培訓高端品牌 - 華清遠見教育科技集團<北京總部官網>,專注嵌入式工程師培養15年!
當前位置: > 華清遠見教育科技集團 > 嵌入式學習 > 講師博文 > 線程解析(三)
線程解析(三)
時間:2016-12-30作者:華清遠見

前面我們說(shuo)了線程的(de)創建(jian)和撤(che)銷(xiao),這里我們說(shuo)一下線程間(jian)的(de)同步的(de)問題。

當同一個(ge)(ge)進程(cheng)(cheng)(cheng)中存(cun)在多個(ge)(ge)線程(cheng)(cheng)(cheng)的(de)(de)(de)時(shi)候,多個(ge)(ge)線程(cheng)(cheng)(cheng)共享(xiang)相(xiang)同的(de)(de)(de)內(nei)存(cun),確保(bao)每(mei)個(ge)(ge)線程(cheng)(cheng)(cheng)能夠看到一致的(de)(de)(de)數據(ju)視圖,如果每(mei)個(ge)(ge)線程(cheng)(cheng)(cheng)中都(dou)不(bu)(bu)(bu)會讀(du)取(qu)或(huo)修(xiu)改(gai)共同享(xiang)有的(de)(de)(de)變量,就不(bu)(bu)(bu)會存(cun)在一致性的(de)(de)(de)問(wen)題(ti),同樣如果共享(xiang)變量時(shi)只讀(du)的(de)(de)(de)也就不(bu)(bu)(bu)會存(cun)在這(zhe)個(ge)(ge)問(wen)題(ti)。但是,當某個(ge)(ge)線程(cheng)(cheng)(cheng)可(ke)一個(ge)(ge)修(xiu)改(gai)變量,而其他的(de)(de)(de)線程(cheng)(cheng)(cheng)去讀(du)取(qu)或(huo)修(xiu)改(gai)這(zhe)個(ge)(ge)變量的(de)(de)(de)時(shi)候,就需要(yao)進行(xing)線程(cheng)(cheng)(cheng)間的(de)(de)(de)同步(bu),確保(bao)他們訪(fang)問(wen)變量的(de)(de)(de)內(nei)容時(shi)不(bu)(bu)(bu)會訪(fang)問(wen)到無效(xiao)的(de)(de)(de)數據(ju)。

這里介紹一種實現同步(bu)的方法:互斥(chi)量(liang)

互斥(chi)鎖本質上是一(yi)把鎖,在訪(fang)問(wen)共享資源的時(shi)候(hou)對互斥(chi)量進行加鎖,訪(fang)問(wen)結(jie)束后解鎖。在這里我們(men)說一(yi)下(xia)如何去操作互斥(chi)鎖。

1、 創(chuang)建和撤銷(xiao)

互斥量用pthread_mutex_t數據類型來表示,在使用之前必須對其進行初始化,用完之后釋放內存。互斥量初始化可以用PTHREAD_MUTEX_INITIALIZER來初始化(靜態初始化),亦可以使用pthread_mutex_init函數來實現,這種方法動態的為互斥量分配內存,使用后必須使用pthread_mutex_destroy來釋放內存單元。下面是這些函數的原型:
        pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
        int pthread_mutex_init(pthread_mutex_t *restrict mutex,
        const pthread_mutexattr_t *restrict attr);
        int pthread_mutex_destroy(pthread_mutex_t *mutex);

2、 鎖操作

鎖操作主要包括加鎖pthread_mutex_lock()、解鎖pthread_mutex_unlock()和測試鎖pthread_mutex_trylock()三個。通過pthread_mutex_lock對互斥量加鎖,這里需要獲得鎖,如果無法獲得鎖則調用線程將阻塞到其他線程調用pthread_mutex_unlock對互斥量解鎖。
        int pthread_mutex_lock(pthread_mutex_t *mutex);
        int pthread_mutex_trylock(pthread_mutex_t *mutex);
  &nbsp;     int pthread_mutex_unlock(pthread_mutex_t *mutex);

如果線程(cheng)不希望(wang)被阻塞(sai),則可以調用pthread_mutex_trylock嘗試對互(hu)斥(chi)量(liang)進行加鎖(suo),當互(hu)斥(chi)量(liang)沒有被加鎖(suo),則函數返回0,并鎖(suo)住互(hu)斥(chi)量(liang),否則會失敗,返回EBUSY.

3、 示例

下面我們用一個例(li)程說(shuo)明一下這些函數(shu)的使(shi)用。

#include <stdio.h>
  &nbsp;     #include <pthread.h>

pthread_mutex_t mutex;

void *thread_a(void *arg)
        {
                printf("thread a enter\n");
                pthread_mutex_lock(&mutex);
                printf("mutex lock\n");
                sleep(10);
                pthread_mutex_unlock(&mutex);
                printf("mutex unlock\n");
   &nbsp;    }

void *thread_b(void *arg)
        {
                printf("thread b enter\n");
                while(pthread_mutex_trylock(&mutex))
                {
                        printf("pthread trylock\n");
                        sleep(1);
                }
                printf("mutex lock\n");
                pthread_mutex_unlock(&mutex);
                printf("mutex unlock\n");
      &nbsp; }

int main(int argc, char **argv)
        {
                pthread_t tid_a,tid_b;
  &nbsp;             int err;

        if(pthread_mutex_init(&mutex, NULL) != 0)
                {
                        perror("pthread_mutex_init");
   &nbsp;  &nbsp;         }

        err = pthread_create(&tid_a,NULL,thread_a,NULL);
                if(err < 0)
                {
                        perror("pthread_create thread_a");
                }
                sleep(1);
                err = pthread_create(&tid_b,NULL,thread_b,NULL);
                if(err < 0)
                {
                        perror("pthread_create thread_a");
                 }

        sleep(20);
                printf("the main close\n");
                return 0;
     &nbsp;  }

結果:
        thread a enter
        mutex lock
        thread b enter
        pthread trylock
        pthread trylock
        pthread trylock
        pthread trylock
        pthread trylock
        pthread trylock
        pthread trylock
        pthread trylock
        pthread trylock
        mutex unlock
        mutex lock
        mutex unlock
   &nbsp;    the main close

由這里(li)的(de)結(jie)果可以看出mutex的(de)用處及幾個相關函數的(de)使用方(fang)法(fa)。

 
發表評論
評論列表(網友評論僅供網友表達個人看法,并不表明本站同意其觀點或證實其描述)