码迷,mamicode.com
首页 > 其他好文 > 详细

按序打印

时间:2021-02-17 14:51:27      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:hang   public   line   一个   不同的   pos   include   之间   value   

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,那么这个信号量就会被共享。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();
    }
};

按序打印

标签:hang   public   line   一个   不同的   pos   include   之间   value   

原文地址:https://www.cnblogs.com/yujingxiang/p/14402641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!