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

模型描述

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

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

void fun(const int num, const std::string &str)
{
    // 主线程与子线程各执行count(3)次
    for (int i = 0; i < count; i++)
    {
        /*
        **  无论主线程还是子线程先运行,首次flag始终为1。
        **  假如先调度主线程,这时num为2,while(num != flag)成立,
        **  所以主线程让出时间片,让子线程先执行。
        */
        while (num != flag)
            std::this_thread::yield();

        // 获得锁后执行指定次数的任务
        mtx.lock();
        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);
        mtx.unlock();
    }
}

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

在这里插入图片描述

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值