(Linux之初學篇)淺談多線程pthread_mutex_t,pthread_cond_t

在開始實例講解之前,讀者應該來了解一個基本概念,多線程是在同一時刻是同時進行的,且是隨機執行的(比如我創建三個線程A,B,C,在A執行的時候B,C也有可能在執行,可能是一個或者兩個)

比如下面的案例演示:

#include<stdio.h>
#include<pthread.h>
#include<error.h>
#include<signal.h>
int d=0;

void *start1(void*argc){
    while(1){
        printf("1111\n");
	sleep(1);
        printf("111111111111\n");
    }
}
void *start2(void*argc){
    while(1){
        printf("2222\n");
        sleep(1);
        printf("222222222222\n");
    }
}
void *start3(void*argc){
    while(1){
        printf("3333\n");
        sleep(1);
        printf("33333333333\n");
    }
}
int main(int argc,char**argv)
{
    pthread_t tid1;
    pthread_t tid2;
    pthread_t tid3;
    if(pthread_create(&tid1, NULL,start1, NULL)<0){
        perror("faluty:");
        return -1;
    }
    if(pthread_create(&tid2, NULL,start2, NULL)<0){
        perror("faluty:");
        return -1;
    }
    if(pthread_create(&tid3, NULL,start3, NULL)<0){
        perror("faluty:");
        return -1;
    }
    while(1){
        sleep(1);
    }
     return 0;
}

初學者不瞭解線程併發(單核CPU)的概念認爲結果顯示應該類似這樣:

1111

111111111111

2222

22222222222

事實上運行結果是這樣的:

 

好了,在我們瞭解到之後,我們開始進入我們的重點講解:

 

#include<stdio.h>
#include<pthread.h>
#include<error.h>
#include<signal.h>
#include<stdlib.h>
int b=0;
pthread_mutex_t  ma=PTHREAD_MUTEX_INITIALIZER;//生成一把鎖ma,並將它初始化
pthread_cond_t   ca=PTHREAD_COND_INITIALIZER; //條件鎖,pthread_cond_wait,pthread_cond_signal配合使用
void *start1(void*argc){
    while(1){
        pthread_mutex_lock(&ma);//給我的線程1上把鎖
        printf("I'm start1,current b is%d\n",b);
        pthread_cond_wait(&ca,&ma);//在執行完上面的指令後,我讓他處於等待狀態,當接收到pthread_cond_signal的指令後,我在開始執行下面的指令
        pthread_mutex_unlock(&ma);
        sleep(1);
        printf("1111111111\n");
    }
}
#if 0
void *start2(void*argc){
    while(1){
        pthread_mutex_lock(&sd);
        printf("I'm start2,current value is:%d\n",a);
        pthread_mutex_unlock(&sd);
    }
    sleep(1);
}
#endif
int main(int argc,char**argv)
{
    pthread_t tid;
    if(pthread_create(&tid, NULL,start1, NULL)<0){
        perror("faluty:");
        return -1;
    }
    while(1){
        printf("3333\n");
        b++;
        sleep(1);
        if(b>10){                   //我設置讓線程一不阻塞的條件
           pthread_cond_signal(&ca);//給pthread_cond_wait發出停止阻塞的指令
        }
        printf("33333333333\n");
    }
     return 0;
}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章