1.一个生产者对应多个消费者

cpp
#include<myhead.h>
//创建条件变量
pthread_cond_t cond;
//创建一个互斥锁
pthread_mutex_t mutex;
//生产者
void *tast1(void *arg)
{
int count=0;
while(1)
{
if(count==3)
break;
sleep(1);
printf("生产了一辆汽车\n");
pthread_cond_signal(&cond);
count++;
}
pthread_exit(NULL);
}
//消费者
void *tast2(void *arg)
{
pthread_mutex_lock(&mutex);
pthread_cond_wait(&cond,&mutex);
printf("消费者购买了一辆车\n");
pthread_mutex_unlock(&mutex);
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//初始化条件变量
if(pthread_cond_init(&cond,NULL)!=0)
{
printf("pthread_cond_init error\n");
return -1;
}
//初始化互斥锁
if(pthread_mutex_init(&mutex,NULL)!=0)
{
printf("pthread_mutex_init\n");
return -1;
}
//创建多个线程
pthread_t tid[4];
//生产者线程
if(pthread_create(&tid[0],NULL,tast1,NULL)!=0)
{
printf("pthread_create error\n");
}
//消费者进程
for(int i=1;i<4;i++)
{
if(pthread_create(&tid[i],NULL,tast2,NULL)!=0)
{
printf("pthread_create error\n");
return -1;
}
}
for(int i=0;i<4;i++)
pthread_join(tid[i],NULL);
return 0;
}
2使用多线程完成abc的顺序打印
cpp
#include<myhead.h>
//定义一个无名信号
sem_t sem[3];
void *tast1(void *argc)
{
sem_post(&sem[0]);
int count=0;
while(1)
{
if(count==5)
break;
sem_wait(&sem[0]);
printf("a");
sleep(1);
fflush(stdout);
sem_post(&sem[1]);
count++;
}
pthread_exit(NULL);
}
void *tast2(void *argc)
{
int count=0;
while(1)
{
if(count==5)
break;
sem_wait(&sem[1]);
printf("b");
sleep(1);
fflush(stdout);
sem_post(&sem[2]);
count++;
}
pthread_exit(NULL);
}
void *tast3(void *argc)
{
int count=0;
while(1)
{
if(count==5)
break;
sem_wait(&sem[2]);
printf("c ");
sleep(1);
fflush(stdout);
sem_post(&sem[0]);
count++;
}
pthread_exit(NULL);
}
int main(int argc, const char *argv[])
{
//初始化信号量
for(int i=0;i<3;i++)
sem_init(&sem[i],0,0);
pthread_t pid1,pid2,pid3;
if(pthread_create(&pid1,NULL,tast1,NULL)!=0)
{
printf("pthread_create error");
return -1;
}
if(pthread_create(&pid2,NULL,tast2,NULL)!=0)
{
printf("pthread_create error");
return -1;
}
if(pthread_create(&pid3,NULL,tast3,NULL)!=0)
{
printf("pthread_create error");
return -1;
}
//回收线程资源
pthread_join(pid1,NULL);
pthread_join(pid2,NULL);
pthread_join(pid3,NULL);
//销毁无名信号量
for(int i=0;i<3;i++)
{
if(sem_destroy(&sem[i])==-1)
{
perror("destroy error");
return -1;
}
}
return 0;
}