首页 > 代码库 > c++11线程之条件变量condition_variable(二)
c++11线程之条件变量condition_variable(二)
题目:编写一个程序,开启3个线程,这3个线程的ID分别为A、B、C,每个线程将自己的ID在屏幕上打印10遍,要求输出结果必须按ABC的顺序显示;如:ABCABC….依次递推。
采用C++11实现:
[cpp] view plaincopyprint?
- #include<iostream>
- #include<thread>
- #include<mutex>
- #include<condition_variable>
- using namespace std;
- mutex m;
- condition_variable cond;
- int LOOP=10;
- int flag=0;
- void fun(int id){
- for(int i=0;i<LOOP;i++){
- unique_lock<mutex> lk(m);
- while(id!=flag)//一定要用循环判断,若是if多个阻塞线程唤醒后同时处于临界区
- cond.wait(lk);
- cout<<(u_char)(‘A‘+id)<<" ";
- flag=(flag+1)%3;
- cond.notify_all();
- }
- }
- int main(){
- thread B(fun,1);
- thread C(fun,2);
- fun(0);
- cout<<endl;
- B.join();
- C.join();
- return 0;
- }
总结:这个题与上一个稍微复杂,因为它多了一个线程,多了一个线程问题就来了,假设有线程ABC,我们要让A先执行一部分代码,BCwait,这好办,通过条件变量让BC等待,A执行完后BC都接到信号,此时BC同时执行?不处理的话确实是同时执行,但是上题是确保B先执行,那就要注意上面代码的红色区域,通过while判断:当A执行完后,我们想执行B,那需要A执行后改变一下标志量flag,这里是加1,此时BC同时收到信号继续执行,因为while的存在,又要进行判断,这次判断的结果是B跳出while,而C继续循环停在wait处,同理,B执行后,同样设置flag,然后c跳出循环,这样就达到控制3个线程顺序的效果了。而根据需求不同,需要改变策略,但是mutex、condition_variable、flag三个全局变量配合达到控制目的是必不可少的,另外while也是实现控制的必要技巧,其它不确定技巧也基本是利用while实现。
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。