栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

c++使用线程将a、b按照交替的顺序进行输出

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

c++使用线程将a、b按照交替的顺序进行输出

c++使用线程将a、b按照交替的顺序进行输出
    • 线程注意事项
    • 单线程操作交替打印a和b
    • 多线程操作交替打印a和b
    • 程序结果分析

线程注意事项

线程是同步进行的,运行结果不分定义的线程对象调用函数的先后顺序(即线程的执行顺序与语句定义的先后顺序关系不大)

//举个例子  --下面的fb和fa都是函数名称
thread tb(fb); //创建了一个线程对象tb,使用函数fb进行线程初始化
thread ta(fa); //创建了一个线程对象ta,使用函数fa进行线程初始化
//这里程序运行可能先执行的是线程ta再执行线程tb
单线程操作交替打印a和b

利用信号量控制线程进行a和b的轮换打印

//使用线程使之能够按照a、b交替的顺序进行输出。----利用信号量进行控制 
#include 
#include 
using namespace std;
#define LOOP 10  
int loop=0;
typedef int semaphore;  //定义同步信号量类型
semaphore sab=0;  //sab是信号量  目的是为了控制程序执行完一次a后再执行b 

void fa(){
	while(loop++0); 
		cout<<"fa print an";
		sab++;
	}
}
void fb(){
	while(loop++0);结果为false,又再次执行了cout<<"fa";语句.这与题目要求a,b循环输出有误 
		
//sab--;语句在cout<<"fb";语句下面,则表示没有执行cout语句之前无法修改sab--;虽然结果正确但是程序存在一个隐藏的bug 
//(如果有两个及以上的进程都控制fb函数,那么可能多个进程会同时进入临界区执行cout语句,此时cout语句就可能被执行多次 )
		
//!!!实际情况针对于信号量的修改 应该是进入临界区之后首先对信号量进行修改,再进行其它语句的操作  
//所以针对于此(既保证进入临界区之后首先对信号量进行修改又保证结果是a,b依次轮换输出),
//可以再定义一个信号量sba,用两个信号量来修改同一个函数 ---即为下面所讲的多线程操作交替打印a和b

int main(){
	thread tb(fb);   //不利用信号量进行控制时,可能先执行fa也可能先执行fb 
	thread ta(fa);
	tb.join();
	ta.join();
	return 0;
}
多线程操作交替打印a和b

利用两个信号量进行对线程的操作

#include 
#include 
using namespace std;
#define LOOP 10
int loop=0;
typedef int semaphore;  //同步信号量类型
//信号量初始化不同参数,结果显示也会不同 
semaphore sab=0,sba=1;		//程序会先输出fb,再输出fa 
//sab=1,sba=0;				//程序会先输出fb,再输出fa
//sab=0,sba=0;				//程序会陷入死循环  ctrl+c退出程序 
void fa(){
	while(loop++ 
程序结果分析 
//程序运行结果展示如下
fa print a
fb print b
fa print a
fb print b
fa print a
fb print b
fa print a
fb print b
fa print a
fb print b

结果分析: 最后出来的结果先是a然后再是b.
可以先假设执行的是线程ta,则先进入函数fa,然后通过对信号量sab和sba的判断,可知执行了一次语句cout<<“fa”; 之后sba=0,sab=1,再执行while(sba<=0)语句符合条件,则一直进行空循环,fa对应的线程ta处于等待状态,然后程序就会执行其他线程–tb线程.
所以接着执行fb函数,同理通过对信号量sab和sba的判断,可知执行了一次语句cout<<“fb”;之后sba=1,sab=0; 再执行while(sab<=0)语句符合条件,则一直进行空循环,fb对应的线程tb处于等待状态,然后程序就会执行其他线程–ta线程.
所以就这样循环这操作,依次轮换输出a和b,直至程序运行while(loop++

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/396093.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号