信号量
两个信号量:firstJobDone协调第一个线程和第二个线程之间的执行顺序;secondJobDone协调第二个线程和第三个线程之间的执行顺序。
firstJobDone和secondJobDone的初始值为0,表示刚开始第二个线程和第三个线程为阻塞状态。
first()函数没有限制,可以直接执行。
printFirst()执行完毕后,将信号量firstJobDone的值+1,此时第二个进程将被唤醒。
第二个进程结束后,将信号量secondJobDone的值+1,此时第三个进程将被唤醒。
c++中信号量机制的实现
头文件:#include <semaphore.h>
初始化信号量:
extern int sem_init __P ((sem_t *__sem, int __pshared, unsigned int __value));
// sem为指向信号量结构的一个指针
// pshared----值为0表示只能为当前进程的所有线程共享,不为0表示可以在进程间共享
// value----信号量的初始值
操作:
sem_post(sem_t *sem); //增加信号量的值。
sem_wait(sem_t *sem); //用来阻塞当前线程直到信号量sem的值大于0,解除阻塞后将sem的值减一,表明公共资源经使用后减少。
#include <semaphore.h>
class Foo {
public:
sem_t firstJobDone;
sem_t secondJobDone;
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();
}
};