C++多线程习题:非原创增加注释(01-2)

模型描述

  1. 子线程循环 1 次,然后主线程循环 2 次。
  2. 接着又回到子线程循环 1 次,之后再回到主线程循环 2 次。
  3. 如此往复3次。
#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>

const int count = 3;
int flag = 1;
std::mutex mtx;
std::condition_variable cv;

void fun(const int num, const std::string &str)
{
    // 主线程与子线程各执行count(3)次
    for (int i = 0; i < count; i++)
    {
        std::unique_lock<std::mutex> lk(mtx);
        // 使用条件变量等待条件(num==flag)成立
        // 假如首次先调度主线程,这时num为2,num==flag不成立,主线程等待。
        // 而如果子线程先运行,这里条件成立,子线程获得锁。
        cv.wait(lk, [&] { return num == flag; });

        // 锁此时已经处于上锁状态

        // 获得锁后执行指定次数的任务
        for (int j = 0; j < num; ++j)
            std::cout << str << std::endl;

        // 然后切换执行标记,以保证下次让对方线程运行。
        std::this_thread::sleep_for(std::chrono::seconds(1));
        flag = (flag == 1 ? 2 : 1);

        // 释放锁
        lk.unlock();
        // 发出一次通知,假如第一次主线程先运行了,它此刻正在等待锁
        // 锁的释放使得主线程被调度,而子线程转入等待状态。
        cv.notify_one();
    }
}

int main()
{
    auto start = std::chrono::high_resolution_clock::now();
    std::thread child(fun, 1, "child");
    fun(2, "father");
    child.join();
    auto end = std::chrono::high_resolution_clock::now();
    std::chrono::duration<double, std::milli> elapsed = end - start;
    std::cout << elapsed.count() << std::endl;
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值