C++三个线程循环打印ABC

上次面试被问到用三个线程循环打印一串字符串,当时没答好,现在一想其实挺简单的,只要用条件变量就好了。使用C++11的标准线程语法,用一个int变量控制条件变量的wait()阻塞等待时机,用notify_all()唤醒条件变量。

具体的代码如下,3个线程分别打印ABC,循环10次:

#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;
}

运行结果如下:

C++三个线程循环打印ABC

原文链接: https://www.cnblogs.com/ladawn/p/8671018.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/271377

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月14日 下午9:51
下一篇 2023年2月14日 下午9:53

相关推荐