BACI并发程序设计

本文介绍了BACI并发程序设计,包括基于C++的BACI语法,如`cobegin`、信号量(Semaphores和Binarysem)、`atomic`关键字及`suspend`、`revive`函数。同时,讲解了在Linux环境下设置BACI编译环境的步骤,并给出了生产者消费者问题和哲学家就餐问题的并发解决方案,展示了BACI如何用于模拟进程并发和同步。
摘要由CSDN通过智能技术生成

           BACI并发程序设计

                                                                                      (操作系统课程实验,花时间研究了下)

BACI为我们提供了提供了一个可以编写并发程序的环境,在这个平台上,我们可以很容易的模拟程序的并发执行,在这种并行的编译环境中,可以把BACI中的一些语句嵌入到C++CJava等高等程序中,使程序可以并行执行 .

一.基于C++BACI语法(C—BACI Compiler)

该语法结构是在C++语法结构的基础上,增加一些并发语句扩展而来,一下是一些常用的并发语句

1.    cobegin函数

BACI系统中,并发进程与并发线程同步,多个进程可以并发的在cobegin 块中来并发执行,该函数必须在主函数中,语法结构为:

cobegin {

       proc1(...);proc2(...);. . . . procN(...);

}

其中每个进程并发随机执行,每次执行的顺序可能会不一样,当所有的进程接受后,该函数结束。

2.  Semaphores/Binarysem

信号量的(Semaphores)机制可以更方便的实现进程同步,Semaphores是一种如C”int”一样的类型,可以用来定义信号量类型的变量,Binarysem是一种二进制信号量,它所定义的变量只能取10,常用来表示互斥。

1).信号量的声明和初始化

semaphores a;

binarysem  s;

上面声明了两个信号量ab,其中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,sem1,调用P的进程可以继续执行,如果sem=0,则该进程阻塞,该函数操作是原子性的.

            v(sem): 如果v=0,或有进程阻塞,则将其唤醒,如果没有进程等待,将sem1,在任何时候调用v的进程可以继续执行,其操作也是原子的.

3.atomic

atomic关键字定义了原子操作,即该函数操作不可剥夺,每次只能一个进程访问

用法:在要原子执行的函数前加atomic即可,如:

atomic int sum(){

 . . .  ..

}

sum()函数就可以原子操作了

4.void suspend(void)

suspend函数将调用的线程挂起

5.void revive (int process_number)

该函数用于唤醒某个进程,其进程号为process_number

其他语法结构参见网站:

http://inside.mines.edu/fs_home/tcamp/baci/index.html#Introduction

  • 5
    点赞
  • 51
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值