c++11线程之条件变量condition_variable(一)

题目:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。注意:一定是子线程先执行,主线程再执行。

  1. #include<iostream>  
  2. #include<thread>  
  3. #include<mutex>  
  4. #include<condition_variable>  
  5. using namespace std;  
  6. mutex m;  
  7. condition_variable cond;  
  8. int flag=10;  
  9. void fun(int num){  
  10.     for(int i=0;i<50;i++){  
  11.     unique_lock<mutex> lk(m);//A unique lock is an object that manages a mutex object with unique ownership in both states: locked and unlocked.  
  12.         while(flag!=num)  
  13.             cond.wait(lk);//在调用wait时会执行lk.unlock()  
  14.         for(int j=0;j<num;j++)  
  15.             cout<<j<<" ";  
  16.         cout<<endl;  
  17.         flag=(num==10)?100:10;  
  18.         cond.notify_one();//被阻塞的线程唤醒后lk.lock()恢复在调用wait前的状态  
  19.     }  
  20. }  
  21. int main(){  
  22.     thread child(fun,10);  
  23.     fun(100);  
  24.     child.join();  
  25.     return 0;  

这里用的是线程的条件变量,使用条件变量与只是用线互斥程锁的不同在于:条件变量可以控制一个线程等另一个线程执行一段后再执行,或许你说这个互斥锁也可以,但确实是不同的,举例来说,你要开进程A和B,A中有一段代码需要B中的一段代码执行后再执行。如果只用了互斥锁,那你会纠结于到底是先到A那块还是先到B那块,所以互斥锁只是保证两个线程的代码不同时执行,但是要加上先后条件就需要用到条件变量了。如上题,要求是让子线程先执行,有个先后的条件,所以用条件变量更好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值