1. 程式人生 > >linux程式設計---執行緒---互斥鎖

linux程式設計---執行緒---互斥鎖

執行緒間同步機制

互斥鎖通訊機制
互斥以排他方式防止共享資料被併發修改。
(1)在訪問該資源前,首先申請該互斥鎖,如果該互斥處於開鎖狀態,則申請到該鎖物件,
並立即佔有該鎖,以防止其他執行緒訪問該資源。如果該互斥鎖處於鎖定狀態,預設阻塞等待。
(2)只有鎖定該互斥鎖的程序才能釋放該互斥鎖,其他執行緒的釋放操作無效。

初始化鎖
靜態初始化互斥鎖
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);
 
申請互斥鎖
int pthread_mutex_lock(pthread_mutex_t *mutex);

以非阻塞方式申請互斥鎖
int pthread_mutex_trylock(pthread_mutex_t *mutex);

釋放互斥鎖
int pthread_mutex_unlock(pthread_mutex_t *mutex);    
程式示例如下

程式共兩個執行緒,一個執行緒負責從輸入裝置讀取資料,然後存在在全域性變數中,

另一個執行緒負責將全域性變數輸出到輸出裝置中。

#include<stdio.h>
#include<unistd.h>
#include<stdlib.h>
#include<pthread.h>
#include<semaphore.h>
#include<string.h>

void *tfun(void *arg);
pthread_mutex_t gmutex;

#define BUF 1024
char gdata[BUF];
int gtime = 0;

int main(int argc,char*argv[])
{
    int res;
    pthread_t th1;    
    void *thret;
    
    res = pthread_mutex_init(&gmutex,0);
    if(res != 0)
    {
        printf("mutex initialization failed\n");
        exit(-1);
    }
    res = pthread_create(&th1,0,tfun,0);
    if(res != 0)
    {
        printf("thread create failed\n");
        exit(-1);
    }
    
    pthread_mutex_lock(&gmutex);
    printf("input some text,enter 'exit' to finished\n");
    while(!gtime)
    {
        fgets(gdata,BUF,stdin);
        pthread_mutex_unlock(&gmutex);
    
        while(1)
        {
            pthread_mutex_lock(&gmutex);
            if(gdata[0] != '\0')
            {
                pthread_mutex_unlock(&gmutex);
                sleep(1);
            }
            else
                break;
        }        
    }
    pthread_mutex_unlock(&gmutex);
    printf("\n waiting for thread to finish ...\n");
    res = pthread_join(th1,&thret);
    if(res != 0)
    {
        printf("thread join failed\n");
        exit(-1);
    }
    pthread_mutex_destroy(&gmutex);
    exit(0);    
}

void *tfun(void * arg)
{
    sleep(1);
    pthread_mutex_lock(&gmutex);
    while(strncmp("end",gdata,3) != 0)    
    {
        printf("you input %d bytes %s\n",strlen(gdata)-1,gdata);
        gdata[0] = '\0';

        pthread_mutex_unlock(&gmutex);
        sleep(1);
        pthread_mutex_lock(&gmutex);
        while(gdata[0] == '\0')
        {
            pthread_mutex_unlock(&gmutex);
            sleep(1);
            pthread_mutex_lock(&gmutex);
        }
    }
    gtime = 1;
    gdata[0] = '\0';
    pthread_mutex_unlock(&gmutex);
    pthread_exit(0);
}