線程解析(三)

來源:互聯網
上載者:User

作者:曹忠明,華清遠見嵌入式學院講師。

前面我們說了線程的建立和撤銷,這裡我們說一下線程間的同步的問題。

當同一個進程中存在多個線程的時候,多個線程共用相同的記憶體,確保每個線程能夠看到一致的資料檢視,如果每個線程中都不會讀取或修改共同享有的變數,就不會存在一致性的問題,同樣如果共用變數時唯讀也就不會存在這個問題。但是,當某個線程可一個修改變數,而其他的線程去讀取或修改這個變數的時候,就需要進行線程間的同步,確保他們訪問變數的內容時不會訪問到無效的資料。

這裡介紹一種實現同步的方法:互斥量

互斥鎖本質上是一把鎖,在訪問共用資源的時候對互斥量進行加鎖,訪問結束後解鎖。在這裡我們說一下如何去操作互斥鎖。

1、 建立和撤銷

互斥量用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);
        int pthread_mutex_unlock(pthread_mutex_t *mutex);

如果線程不希望被阻塞,則可以調用pthread_mutex_trylock嘗試對互斥量進行加鎖,當互斥量沒有被加鎖,則函數返回0,並鎖住互斥量,否則會失敗,返回EBUSY.

3、 樣本

下面我們用一個常式說明一下這些函數的使用。

#include <stdio.h>
        #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");
        }

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");
        }

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

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

        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;
        }

結果:
        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
        the main close

由這裡的結果可以看出mutex的用處及幾個相關函數的使用方法。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.