面试场景题
1 多线程打印奇数偶数
#include <mutex>
#include<thread>
#include<iostream>
#include<condition_variable>
using namespace std;int cnt = 1;
std::mutex mtx;
std::condition_variable cv;/*先上锁,如果条件为真,继续执行;如果条件为假,阻塞,解锁......
*/void printOdd() {while (cnt <= 100) {unique_lock<mutex> lock(mtx);//等待条件为真cv.wait(lock, []() { return cnt % 2 == 1; });//cv.wait(lock, [cnt]() { return cnt % 2 == 1; }); //报错cout << cnt << endl;++cnt;lock.unlock();cv.notify_all();}
}void printEven() {while (cnt <= 100) {unique_lock<mutex> lock(mtx);cv.wait(lock, []() {return cnt % 2 == 0; });cout << cnt << endl;++cnt;lock.unlock();cv.notify_all();}
}int main() {thread t1(printOdd);thread t2(printEven);t1.join();t2.join();return 0;
}
lambda:
lambda不能捕获静态存储的变量,如全局变量,局部静态变量
但是可以直接访问全局变量,局部静态变量
wait:
wait(lock);
阻塞当前线程,解锁lock
将当前线程添加到等待队列wait(lock, 函数):
首先判断函数返回值,如果是false,就会执行wait,否则,直接返回
2 死锁示例
#include <mutex>
#include<thread>
#include<iostream>
#include<condition_variable>
using namespace std;std::mutex mtx1;
std::mutex mtx2;void p1() {std::unique_lock<std::mutex> lock1(mtx1);std::cout << "线程 1 获得 mutex1." << std::endl;std::this_thread::sleep_for(std::chrono::seconds(1));std::unique_lock<std::mutex> lock2(mtx2);std::cout << "线程 1 获得 mutex2." << std::endl;
}void p2() {std::unique_lock<std::mutex> lock2(mtx2);std::cout << "线程 2 获得 mutex2." << std::endl;std::this_thread::sleep_for(std::chrono::milliseconds(200));std::unique_lock<std::mutex> lock1(mtx1);std::cout << "线程 2 获得 mutex1." << std::endl;
}int main() {thread t1(p1);thread t2(p2);t1.join();t2.join();return 0;
}