【多线程连续打印01010101】有两个线程,一个打印0,一个打印1,让两个线程连续打印010101。一般情况下,多个线程要同时请求cpu资源,所以对打印语句加锁是不行的,因为解锁后谁也不知道哪个线程又抢到了cpu资源。
分析:如果线程0打印”0“,下一步必然让线程0阻塞,并且唤醒线程1。然后线程1打印"1",之后让线程1阻塞,唤醒线程2。这样依次执行。
使用方法:condition_variable类的使用。
使用一个函数:
mutex mu;
condition_variable c_v;
int current = 0;
void fun(int id){
while(true){
/*
*加锁
*设置唤醒当前线程的条件,(当前线程开始被阻塞了)
*打印
*解锁
*更新打印条件,这个条件在当前线程再次打印时能阻塞当前线程
*唤醒其他线程
*/
unique_lock ul(mu);
c_v.wait(ul, [id](){return id == current;
};
//lambda表达式返回1时,线程被唤醒。否则阻塞到当前位置。
cout<
使用两个函数:
void fun0(){
while(true){
/*
*加锁
*设置唤醒当前线程的条件,(当前线程开始被阻塞了)
*打印
*解锁
*更新打印条件,这个条件在当前线程再次打印时能阻塞当前线程
*唤醒其他线程
*/
unique_lock ul(mu);
c_v.wait(ul, [](){return current == 0;
});
//lambda表达式返回1时,线程被唤醒。否则阻塞到当前位置。
current = 1;
cout<<"0";
ul.unlock();
c_v.notify_all();
}
}
void fun1(){
while(true){
/*
*加锁
*设置唤醒当前线程的条件,(当前线程开始被阻塞了)
*打印
*解锁
*更新打印条件,这个条件在当前线程再次打印时能阻塞当前线程
*唤醒其他线程
*/
unique_lock ul(mu);
c_v.wait(ul, [](){return current == 1;
});
//lambda表达式返回1时,线程被唤醒。否则阻塞到当前位置。
current = 0;
cout<<"1";
ul.unlock();
c_v.notify_all();
}}int main(){
thread t1(fun0);
thread t2(fun1);
t1.join();
t2.join();
system("pause");
return 0;
}
推荐阅读
- 个人日记|K8s中Pod生命周期和重启策略
- 学习分享|【C语言函数基础】
- C++|C++浇水装置问题
- 数据结构|C++技巧(用class类实现链表)
- C++|从零开始学C++之基本知识
- 步履拾级杂记|VS2019的各种使用问题及解决方法
- leetcode题解|leetcode#106. 从中序与后序遍历序列构造二叉树
- 动态规划|暴力递归经典问题
- 麦克算法|4指针与队列
- 遇见蓝桥遇见你|小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题