标签:hang public line 一个 不同的 pos include 之间 value
我们提供了一个类:
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()
方法之后被执行。
并发场景,是指需要程序在多线程(或多进程)中同时进行。
一般的并发任务,既可以在同一个cpu上交替执行多个线程或进程,也可以在多个cpu上独立运行。并发任务中主要会出现三种问题。
竞态条件:由于多进程之间的竞争执行,导致程序未按照期望的顺序输出。
死锁:并发程序等待一些必要资源,导致没有程序可以执行。
资源不足:进程被永久剥夺了运行所需的资源。
在应对这三种问题时,主要有是协调并发程序间的共享资源问题。 通过确保程序中关键部分代码的独占性,即在给定的时间内,只有一个线程运行该关键部分的代码。
在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);
#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