1,要实现两个线程 共享一个整形变量 一个线程严格的打印奇数 一个线程严格的打印偶数
// t1打印奇数
// t2打印偶数
// 交替打印
int main()
{
mutex mtx;
int x = 1;
condition_variable cv;
bool flag = false;
// 如果保证t1先运行 condition_variable+flag
// 交替运行
thread t1([&]() {
for (size_t i = 0; i < 10; i++)
{
unique_lock<mutex> lock(mtx);
while (flag)
cv.wait(lock);
cout << this_thread::get_id() << ":" << x << endl;
++x;
flag = true;
cv.notify_one(); // t1notify_one的时候 t2还没有wait
}
});
thread t2([&]() {
for (size_t i = 0; i < 10; i++)
{
unique_lock<mutex> lock(mtx);
while(!flag)
cv.wait(lock);
cout << this_thread::get_id()<<":" << x << endl;
++x;
flag = false;
cv.notify_one();
}
});
t1.join();
t2.join();
return 0;
}
场景 1: t1 先启动,t2 待定
假设 t1 先运行,t1 先抢到 lock, flag 是 false, t1 先打印
flag 改成 true
notetify 没有线程等待
出作用域解锁
t2 两种状况:
a、没启动起来,或者没有分到时间片 ->t2 总会开始运行,lock, flag 是 true, 他不会 wait
t2 打印值,flag 改成 false, notify 唤醒 t1. 后续就是类似交替走了
b、运行起来,lock 阻塞
a: 如果 t2 是在 a 状况,t1 又抢到锁,但是 flag 为 true, wait 阻塞 (同时unlock解锁)
b、如果 t2 是在 b 状况,t1 解锁,唤醒 t2, t2 获取到锁,flag 是 true, t2 不会阻塞
打印
场景 2: t2 先启动,t1 待定
t2 先启动,t2 会 lock, wait (同时unlock解锁)
t1 两种状况:
a、没启动,或者没分到时间片。->t1 总会分到时间片运行,lock, 打印,flag 改成 true
notify t2
b、t1 慢一步,但是也分到时间片开始执行了,t1 lock 阻塞 t2wait 时,unlock 会唤醒 t1 获取锁
保证 t1 先运行
1778

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



