c语言三线程与信号量小结

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线程
  }
}

流程如下

主函数创建,定义,初始化、回收函数

1线程判段奇偶,通过信号量赋值跳转线程

2、3线程输出并统计

效果图在这里插入图片描述

注意问题

线程跳转,信号量赋值,子线程循环
初学者第一次发论坛,欢迎指教,时间紧为打上if判错
参考代码
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值