题目:子线程循环 10 次,接着主线程循环 100 次,接着又回到子线程循环 10 次,接着再回到主线程又循环 100 次,如此循环50次,试写出代码。注意:一定是子线程先执行,主线程再执行。
- #include<iostream>
- #include<thread>
- #include<mutex>
- #include<condition_variable>
- using namespace std;
- mutex m;
- condition_variable cond;
- int flag=10;
- void fun(int num){
- for(int i=0;i<50;i++){
- 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.
- while(flag!=num)
- cond.wait(lk);//在调用wait时会执行lk.unlock()
- for(int j=0;j<num;j++)
- cout<<j<<" ";
- cout<<endl;
- flag=(num==10)?100:10;
- cond.notify_one();//被阻塞的线程唤醒后lk.lock()恢复在调用wait前的状态
- }
- }
- int main(){
- thread child(fun,10);
- fun(100);
- child.join();
- return 0;
- }
这里用的是线程的条件变量,使用条件变量与只是用线互斥程锁的不同在于:条件变量可以控制一个线程等另一个线程执行一段后再执行,或许你说这个互斥锁也可以,但确实是不同的,举例来说,你要开进程A和B,A中有一段代码需要B中的一段代码执行后再执行。如果只用了互斥锁,那你会纠结于到底是先到A那块还是先到B那块,所以互斥锁只是保证两个线程的代码不同时执行,但是要加上先后条件就需要用到条件变量了。如上题,要求是让子线程先执行,有个先后的条件,所以用条件变量更好。