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

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值