模型描述
- 子线程循环 1 次,然后主线程循环 2 次。
- 接着又回到子线程循环 1 次,之后再回到主线程循环 2 次。
- 如此往复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;
}

1972

被折叠的 条评论
为什么被折叠?



