c语言三线程与信号量小结
#用三线程判断奇偶数并用信号量输出
有三个线程执行以下的程序,线程1负责输入10个整数,判断整数的奇偶性,如果是偶数线程2输出,如果是奇数线程3输出,线程2和线程3最后统计输出偶数和奇数的总数。用信号量机制实现这三个线程的同步与互斥活动,并线程来实现
主要思路
首先创建出3个线程,因为线程1必须等线程2或线程3输出一个数才能进行操作,所以需要一个信号量,为了控制线程2和线程3各自控制自己的部分,所以它们各自也需要1个信号量,所以一共是三个信号量。之后就是控制实现pv操作。
具体代码
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<pthread.h>
#include<errno.h>
#include<sys/ipc.h>
#include<semaphore.h>
#define N 10 //定义一个数为10
int size=0,odd=0,even=0,quit=0; //定义三个变量分别表示当前数字,
//偶数个数,奇数个数,退出指示
sem_t sem1,sem2,sem3; //信号量声明
void pthread1(void *arg); //定义三个线程函数
void pthread2(void *arg);
void pthread3(void *arg);
int main(int argc,char *argv[])
{
pthread_t id1,id2,id3; //定义三个线程名
sem_init(&sem1,0,1); //初始化三个信号量,信号量1初始值为1,
sem_init(&sem2,0,0); //其余为0,确保最先进入线程1
sem_init(&sem3,0,0);
pthread_create(&id1,NULL,(void*)pthread1,NULL); //创建三个线程并指定对于执行内容
pthread_create(&id2,NULL,(void*)pthread2,NULL);
pthread_create(&id3,NULL,(void*)pthread3,NULL);
pthread_join(id1,NULL); //回收三个线程
pthread_join(id2,NULL);
pthread_join(id3,NULL);
exit(0); //退出主线程
}
void pthread1(void *arg) //线程1执行函数
{
sem_wait(&sem1); //将信号量1减1
while(1) //无限循环直到退出线程
{
while(size<N) //从0开始计算
{
size++; //先排除0,从1开始计算
if(size%2==0) //当size为偶数
{
sem_post(&sem2); //信号量2加1
}
else //当size为奇数
{
sem_post(&sem3); //信号量3加1
}
sleep(1); //睡眠根据获得信号量进入子线程
}
printf("偶数共有%d个\n",even); //当size大于10时,所以子线程已经运行完
printf("奇数共有%d个\n",odd); //根据获得的个数,打印信息
quit=1; //赋退出指示为1
exit(0); //结束线程1
}
}
void pthread2(void *arg) //线程2执行函数
{
while(1) //循环执行避免子线程退出
{
if(quit) break; //如果收到线程1退出指令则退出线程
sem_wait(&sem2); //信号量2减1
printf("pthr2:%d是偶数\n",size);
even++; //偶数个数加1
sem_post(&sem1); //信号量1加1
sleep(1); //睡眠进入1线程
}
}
void pthread3(void *arg) //线程3执行函数
{
while(1)
{
if(quit) break; //如果收到线程1退出指令则退出线程
sem_wait(&sem3); //信号量3减1
printf("pthr3:%d是奇数\n",size);
odd++; //奇数个数加1
sem_post(&sem1); //信号量1加1
sleep(1); //睡眠进入1线程
}
}