1 题目描述
我们提供了一个类:
public class Foo {
public void one() { print(“one”); }
public void two() { print(“two”); }
public void three() { print(“three”); }
}
三个不同的线程将会共用一个 Foo 实例。
线程 A 将会调用 one() 方法
线程 B 将会调用 two() 方法
线程 C 将会调用 three() 方法
请设计修改程序,以确保 two() 方法在 one() 方法之后被执行,three() 方法在 two() 方法之后被执行。
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/print-in-order
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
1114. 按序打印
2 考点
着重考察多线程的并发控制。
3 Solution
下面主要使用 C++ 来实现。
3.1 解法一:[无锁] 原子变量实现 spin_lock()
定义3个状态: [0,1,2] 然后按顺序切换即可。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Foo {
std::atomic_int m_state{0};
public:
Foo() {
}
void spin_lock(int expect, int set_value, function<void()>& func ){
while(m_state.load() != expect){
// cpu_relax();
}
func();
m_state.store(set_value);
}
void first(function<void()> printFirst) {
spin_lock(0,1, printFirst);
}
void second(function<void()> printSecond) {
spin_lock(1,2,printSecond);
}
void third(function<void()> printThird) {
spin_lock(2,0, printThird);
}
};
|
3.2 使用c++的 future/promise
c++的 future/promise 可以跨线程使用(内部是有mutex), 所以能线程阻塞。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
class Foo {
private:
std::promise<void> pr1;
std::promise<void> pr2;
public:
Foo() {
}
void first(function<void()> printFirst) {
printFirst();
pr1.set_value();
}
void second(function<void()> printSecond) {
pr1.get_future().get();
printSecond();
pr2.set_value();
}
void third(function<void()> printThird) {
pr2.get_future().get();
// printThird() outputs "third". Do not change or remove this line.
printThird();
}
};
|
《全文完》