实验题目:
在 BACI 并发程序设计系统
中实现哲学家就餐问题和生产
者/消费者问题
一、BACI 简介:
BACI 提供了一个可以编写并发程序的环境,在这个平台上,我们可以很容易的模拟程序的
并发执行,在这种并行的编译环境中,可以把 BACI 中的一些语句嵌 入到 C++,C,Java
等高等程序中,使程序可以并行执行 .
基于 C++的 BACI 语法(C—BACI Compiler)
该语法结构是在 C++语法结构的基础上,增加一些并发语句扩展而来,一下是一些常
用的并发语句
1. cobegin 函数
在 BACI 系统中,并发进程与并发线程同步,多个进程可以并发的在 cobegin 块中来并
发执行,该函
数必须在主函数中,语法结构为:
cobegin {
proc1(...);proc2(...);. . . . procN(...);
}
其中每个进程并发随机执行,每次执行的顺序可能会不一样,当所有的进程接受后,
该函数结束。
2. Semaphores/Binarysem
信号量的(Semaphores)机制可以 更方便的实现进程 同步,Semaphores 是一种 如 C
中”int”一样的
类 型,可以用来定义信号量类型的变量,Binarysem 是一种二进制信号量,它所定义
的变量只能取 1
或 0,用来表示互斥。
1).信号量的声明和初始化
semaphores a;
binarysem s;
上面声明了两个信号量 a,b,其中 b 为二进制信号量信号量按如下方式初始化:
Initialsem(semaphores , interger);
Initialsem(binarysem , 0/1);
2)P(wait)/V(signal)函数
强大的 PV 操作与信号量一次很方便的解决了并发进程同步与互斥问题
函数原型:
void p(semaphores &s); or void wait(semaphores &s);
void v(semaphores &s); or void signal(semaphores &s);
函数说明:
p(sem): 如果 sem > 0,则 sem 减 1,调用 P 的进程可以继续执行,如果 sem=0,则该进
程阻塞,该函
数操作是原子性的.
v(sem): 如果 v=0,或有进程阻塞,则将其唤醒,如果没有进程等待,将 sem 加 1,在
任何时候调用
v 的进程可以继续执行,其操作也是原子的.
3.atomic
atomic 关键字定义了原子操作,即该函数操作不可剥夺,每次只能一个进程访问
用法:在要原子执行的函数前加 atomic 即可,如:
atomic int sum(){
. . . ..
}
则 sum()函数就可以原子操作了
4.void suspend(void)
suspend 函数将调用的线程挂起
5.void revive (int process_number)
该函数用于唤醒某个进程,其进程号为 process_number
二、BACI 开发过程:
1、开发环境:
Ubuntu 10.04
2、开发工具:
采用带有 GUI 的 BACI 工具软件,下载地址:
http://inside.mines.edu/fs_home/tcamp/baci/index.html
3、解压后的目录:
4、实验测试过程
(a)软件测试用例:
源代码:jqk.cm
测试结果:
(b):生产者消费者问题(Bounded-Buffer)
在 BACI 系统中模拟生产者,消费者问题,用 PV 操作实现同步,与互斥
源代码(ex1.cm):
在终端进行编译:
运行 GUI
运行结果:
(c):哲学家就餐问题(Dining-Philosophers)
源代码:ex2.cm
编译运行 GUI:
运行结果: