第三章 同步、通信和死锁
实验一:进程互斥与进程同步
进程的互斥和同步是操作系统课程的重要内容,本实验设计算法实现临界区的互斥进入以及进程的同步。
注意:因为进程的管理的权限属于操作系统,用户没有权利管理多个进程的并发执行过程,因此,在实验室机房的通用操作系统平台上无法实现针对并发进程的管理(互斥和同步)。而多线程程序中,线程控制是用户有权做的。因此,本实验使用多线程程序设计技术,利用线程互斥和同步来模拟并发进程的管理,其算法思路和实现过程与操作系统中并发进程的控制本质上是一样的
C语言也支持多线程程序设计,不过多线程不是标准C语言的组成部分,而是需要依赖于添加的库文件。
(1)在Windows下面,可以使用MFC中的标准Windows线程库,不过使用方法非常复杂,还要求懂得VC编程语言,本课程不作讨论。
(2)在Unix/Linux系统下,有所谓的POSIX线程,能够支持C语言的多线程程序设计,相关的工具在pthread.h, semaphore.h,sched.h库文件里(常用的Linux系统都包含了这些库文件,不需要再手动添加)。步骤如下:
编辑程序:假定最后得到程序xx.c
编译链接程序: gcc –o xx -lpthread xx.c
运行程序:./xx
(3)POSIX线程也可以在Windows下运行,即使用所谓的pthreads-win32插件,它可以在ftp://http://doc.xuehai.net/pub/pthreads-win32下载。下载完毕自解压之后,生成一个目录PThread,下面有几个子目录,其中Pre-built.2\include目录即所需要的库。可以在VC环境里编译运行C语言多线程程序。
编辑程序:假定最后得到程序xx.c
编译链接程序:将PThread\Pre-built.2\includ目录下的include和lib两个子目录复制到VC的安装目录下面,例如C:\Program Files\Microsoft Visual Studio\VC98,覆盖掉原来的目录。然后编译。
运行程序:在VC++ 6.0环境中,选(工程--》设置--》连接)里的库模块里增加pthreadVC2.lib,然后运行。
1 POSIX线程编程基础
POSIX线程模型中创建线程使用pthread_t变量,其步骤为:
声明:pthread_t a_thread;
创建:使用函数
int pthread_create(pthread_t *p, const pthread_attr_t *attr, void *(*start_rtn)(void),void *arg); 返回值: 如果正常创建,返回0;否则返回一个非零的值。
第一个参数:pthread_t变量(线程变量)的名字;
第二个参数:设置线程属性。
第三个参数:线程运行函数的起始地址(即函数名)。
第四个参数:线程运行函数的参数。
定义线程的运行函数:也叫线程运行方法,即线程要做的事情。例如