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

《全文完》