在開始實例講解之前,讀者應該來了解一個基本概念,多線程是在同一時刻是同時進行的,且是隨機執行的(比如我創建三個線程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;
}