张银峰的编程课堂

C++多线程非原创案例注解(1)

问题描述

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