在开始实例讲解之前,读者应该来了解一个基本概念,多线程是在同一时刻是同时进行的,且是随机执行的(比如我创建三个线程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;
}