1、创建线程
pthread_create(pthread_t* __pthread_ptr, pthread_attr_t const* __attr, void* (*__start_routine)(void*), void*)
第一个参数:线程的引用第二个参数:线程的属性
第三个参数:线程执行的方法
第四个参数:线程传递给线程执行方法的参数
2、pthread_join函数
pthread_join(pthread_t __pthread,void** __return_value_ptr);
该函数的作用:主线程要等待__pthread线程执行完成后,才执行
__pthread:线程的引用
__return_value_ptr:线程在执行pthread_exit(0)时传入的值。在此处纯传入的是0。
3、线程的同步
锁:pthread_mutex_t mutex
条件变量:pthread_cond_t has_product
加锁:pthread_mutex_lock(&mutex)
开锁:pthread_mutex_unlock(&mutex)
阻塞:pthread_cond_wait(&has_product,&mutex)
解开阻塞的信号:pthread_cond_signal(&has_product)
相关代码:
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
// 产品数量
int pruductNum=0;
//互斥锁
pthread_mutex_t mutex;
//条件变量
pthread_cond_t has_product;
//生产者
void * produce(void *arg){
char* name=(char*)arg;
for(;;){//不断循环
//锁住
pthread_mutex_lock(&mutex);
pruductNum++;
printf("生产者 生产 %d \n",pruductNum);
//发送一条解开阻塞的信号
pthread_cond_signal(&has_product);
//解锁
pthread_mutex_unlock(&mutex);
sleep(3);
}
}
//消费者
void* consumer(void* arg){
char* name=(char*)arg;
for(;;){//不断循环
//加锁
pthread_mutex_lock(&mutex);
//如果产品列表为空
while(pruductNum==0){
printf("没有产品了");
pthread_cond_wait(&has_product,&mutex);
}
pruductNum--;
printf("消费者 %s 消费%d\n",name,pruductNum);
pthread_mutex_unlock(&mutex);
sleep(1);
}
}
void main(){
pthread_mutex_init(&mutex,NULL);
pthread_cond_init(&has_product,NULL);
//线程的引用
pthread_t tid1,tid2,tid3;
pthread_create(&tid1,NULL,produce,"生产者");
pthread_create(&tid2,NULL,consumer,"消费者1");
pthread_create(&tid3,NULL,consumer,"消费者2");
void *rval;
pthread_join(tid1,&rval);
pthread_join(tid2,&rval);
pthread_join(tid3,&rval);
printf("线程结束%d\n",rval);
}