分享一个最近面试过程中遇到的笔试问题:用线程的方式实现三个线程循环打印“ABC”,即一个线程打印“A”,一个线程打印“B”,第三个线程打印“C”,但是要保证ABC打印输出的顺序,下面是我在网上看到别人分享的一个比较容易理解的实现方式,因为每次忘了都要去搜索,索性自己写篇博客记录一下,同时也分享给跟我一样迷茫不知道该怎么实现的小伙伴们。
注: 代码可能看起来很繁琐,也没有优化,但是我个人觉得这样最原始的可能更方便刚入门的小伙伴们理解。
#include <iostream>
#include <thread>
#include <condition_variable>
std::mutex mtx;
std::condition_variable cv;
int ready = 0;
void PrintString_1()
{
std::unique_lock<std::mutex> lk(mtx);
int cnt = 0;
while(cnt<10)
{
while(ready != 0)
cv.wait(lk);
std::cout<<std::this_thread::get_id()<<" : "<<"A"<<std::endl;
ready = 1;
cnt++;
cv.notify_all();
}
}
void PrintString_2()
{
std::unique_lock<std::mutex> lk(mtx);
int cnt = 0;
while(cnt<10)
{
while(ready != 1)
cv.wait(lk);
std::cout<<std::this_thread::get_id()<<" : "<<"B"<<std::endl;
ready = 2;
cnt++;
cv.notify_all();
}
}
void PrintString_3()
{
std::unique_lock<std::mutex> lk(mtx);
int cnt = 0;
while(cnt<10)
{
while(ready != 2)
cv.wait(lk);
std::cout<<std::this_thread::get_id()<<" : "<<"C"<<std::endl;
ready = 0;
cnt++;
cv.notify_all();
}
}
int main()
{
std::thread t1(PrintString_1);
std::thread t2(PrintString_2);
std::thread t3(PrintString_3);
t1.join();
t2.join();
t3.join();
return 0;
}
下面是运行结果: