按序打印

1 题目

我们提供了一个类:

public class Foo {
  public void first() { print("first"); }
  public void second() { print("second"); }
  public void third() { print("third"); }
}

三个不同的线程 A、B、C 将会共用一个 Foo 实例。

  • 一个将会调用 first() 方法
  • 一个将会调用 second() 方法
  • 还有一个将会调用 third() 方法

请设计修改程序,以确保 second() 方法在 first() 方法之后被执行,third() 方法在 second() 方法之后被执行。

2 相关概念

2.1 并发

并发场景,是指需要程序在多线程(或多进程)中同时进行。

一般的并发任务,既可以在同一个cpu上交替执行多个线程或进程,也可以在多个cpu上独立运行。并发任务中主要会出现三种问题。

  • 竞态条件:由于多进程之间的竞争执行,导致程序未按照期望的顺序输出。

  • 死锁:并发程序等待一些必要资源,导致没有程序可以执行。

  • 资源不足:进程被永久剥夺了运行所需的资源。

在应对这三种问题时,主要有是协调并发程序间的共享资源问题。 通过确保程序中关键部分代码的独占性,即在给定的时间内,只有一个线程运行该关键部分的代码。

2.2 Semaphore (信号量)

在C++代码中,可以通过 Semaphore 达到线程间同步的目的。semaphore.h 头文件下,有如下成员变量和函数。

sem_t——用于执行信号量操作类型变量。

sem_t firstJobDone;

sem_init()——初始化一个未命名的信号量。其中,pshared参数指示是否要使用这个信号量在进程的线程之间或进程之间共享。如果pshared的值是0,那么这个信号量就会被共享。value参数指示是否锁定信号,如果value的值为0,那么信号锁定,如果为1,则信号解锁。 sem_init() 成功返回 0 ;错误时,返回 -1。

// int sem_init(sem_t *sem, int pshared, unsigned int value);
sem_init(&firstJobDone, 0, 0);

sem_post()——解锁一个信号量。它的作用是给信号量的value值加上一个“1”。

sem_post(&firstJobDone);

sem_wait()——减少(锁定)sem所指向的信号量。它的作用是从信号量的value值减去一个“1”。
如果对一个值为0的信号量调用sem_wait(),这个函数就会原地等待直到有其它线程增加了这个值使它不再是0为止。

sem_wait(&firstJobDone);

3 代码

#include <semaphore.h>
class Foo {
protected:
    sem_t firstJobDone;
    sem_t secondJobDone;

public:
    
    Foo() {
        sem_init(&firstJobDone, 0, 0);
        sem_init(&secondJobDone, 0, 0);
    }

    void first(function<void()> printFirst) {
        
        // printFirst() outputs "first". Do not change or remove this line.
        printFirst();
        sem_post(&firstJobDone);
    }

    void second(function<void()> printSecond) {
        sem_wait(&firstJobDone);
        // printSecond() outputs "second". Do not change or remove this line.
        printSecond();
        sem_post(&secondJobDone);
    }

    void third(function<void()> printThird) {
        sem_wait(&secondJobDone);
        // printThird() outputs "third". Do not change or remove this line.
        printThird();
    }
};
posted @ 2021-02-14 20:45  iamwasabi  阅读(120)  评论(0)    收藏  举报