- 线程注意事项
- 单线程操作交替打印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多线程操作交替打印a和b#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; }
利用两个信号量进行对线程的操作
#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++



