题目描述
leetcode原题链接:交替打印FooBar
两个不同的线程将会共用一个 FooBar 实例:
线程 A 将会调用 foo() 方法,而
线程 B 将会调用 bar() 方法
请设计修改程序,以确保 "foobar" 被输出 n 次。
举例
示例 1:
输入:n = 1
输出:"foobar"
解释:这里有两个线程被异步启动。其中一个调用 foo() 方法, 另一个调用 bar() 方法,"foobar" 将被输出一次。
示例 2:
输入:n = 2
输出:"foobarfoobar"
解释:"foobar" 将被输出两次。
解题方法: 用thread + unique_lock + condition_variable,即线程+锁+条件变量。
代码
#include <iostream>
#include <mutex>
#include <condition_variable>
#include <thread>
using namespace std;
class FooBar {
private:
int n;
std::mutex mtx;
std::condition_variable cond;
bool flag;
public:
FooBar(int n) {
this->n = n;
flag = true;
}
void foo() {
for (int i = 0;i < n; i++) {
std::unique_lock<std::mutex> lk(mtx);
cond.wait(lk, [this]{ return flag;});
std::cout << "foo";
flag = false;
cond.notify_one();
}
}
void bar() {
for (int i = 0; i < n; i++) {
std::unique_lock<std::mutex> lk(mtx);
cond.wait(lk, [this] { return !flag;});
std::cout << "bar";
flag = true;
cond.notify_one();
}
}
};
int main()
{
FooBar fb(2);
std::thread t1(&FooBar::foo, &fb);
std::thread t2(&FooBar::bar, &fb);
t1.join();
t2.join();
return 0;
}
代码运行结果如下:
foobar