按序打印

时间:2021-02-17 14:51:27   收藏:0   阅读:0

1 题目

我们提供了一个类:

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

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

请设计修改程序,以确保 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,那么这个信号量就会被共享。sem_init() 成功返回 0 ;错误时,返回 -1。

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

sem_post()——解锁一个信号量。

sem_post(&firstJobDone);

sem_wait()——减少(锁定)sem所指向的信号量。

sem_wait(&firstJobDone);

3 代码

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

public:
    
    Foo() {
        sem_init(&firstJoweibDone, 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();
    }
};
评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!