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