求教高手操作系统多线程同步问题

qingtian94521
求教高手操作系统多线程同步问题

各位大侠,小弟才疏学浅,望有才之士予以指点。。小弟谢过。。
一。生产者,消费者问题
(1)创建生产者和消费者线程
在Windows2000环境下,创建一个控制台进程,在此进程中创建n个线程来模拟生产者或者消费者。这些线程的信息由本程序定义的“测试用例文件”中予以指定。
该文件的格式和含义如下:
3
1   P   3
2   P   4
3   C   4  1
4   P   2
5   C   3  1   2   4
    第一行说明程序中设置几个临界区,其余每行分别描述了一个生产者或者消费者线程的信息。每一行的各字段间用Tab键隔开。不管是消费者还是生产者,都有一个对应的线程号,即每一行开始字段那个整数。第二个字段用字母P或者C区分是生产者还是消费者。第三个字段表示在进入相应线程后,在进行生产和消费动作前的休眠时间,以秒计时;这样做的目的是可以通过调整这一列参数,控制开始进行生产和消费动作的时间。如果是代表生产者,则该行只有三个字段。如果代表消费者,则该行后边还有若干字段,代表要求消费的产品所对应的生产者的线程号。所以务必确认这些对应的线程号存在并且该线程代表一个生产者。
(2)生产和消费的规则
在按照上述要求创建线程进行相应的读写操作时,还需要符合以下要求:
①共享缓冲区存在空闲空间时,生产者即可使用共享缓冲区。
    ②从上边的测试数据文件例子可以看出,某一生产者生产一个产品后,可能不止一个消费者,或者一个消费者多次地请求消费该产品。此时,只有当所有的消费需求都被满足以后,该产品所在的共享缓冲区才可以被释放,并作为空闲空间允许新的生产者使用。
    ③每个消费者线程的各个消费需求之间存在先后顺序。例如上述测试用例文件包含一行信息“5 C 3 l 2 4”,可知这代表一个消费者线程,该线程请求消费1,2,4号生产者线程生产的产品。而这种消费是有严格顺序的,消费1号线程产品的请求得到满足后才能继续往下请求2号生产者线程的产品。
④要求在每个线程发出读写操作申请、开始读写操作和结束读写操作时分别显示提示信息。
(3)相关基础知识
    本实验所使用的生产者和消费者模型具有如下特点:
    本实验的多个缓冲区不是环形循环的,也不要求按顺序访问。生产者可以把产品放到目前某一个空缓冲区中。
    消费者只消费指定生产者的产品。
    在测试用例文件中指定了所有的生产和消费的需求,只有当共享缓冲区的数据满足了所有关于它的消费需求后,此共享缓冲区才可以作为空闲空间允许新的生产者使用。
    本实验在为生产者分配缓冲区时各生产者间必须互斥,此后各个生产者的具体生产活动可以并发。而消费者之间只有在对同一产品进行消费时才需要互斥,同时它们在消费过程结束时需要判断该消费对象是否已经消费完毕并清除该产品。
Windows用来实现同步和互斥的实体。在Windows中,常见的同步对象有:信号量(Semaphore)、互斥量(Mutex)、临界段(CriticalSection)等。使用这些对象都分为三个步骤,一是创建或者初始化:接着请求该同步对象,随即进入临界区,这一步对应于互斥量的上锁;最后释放该同步对象,这对应于互斥量的解锁。这些同步对象在一个线程中创建,在其他线程中都可以使用,从而实现同步互斥。
3、相关API函数
CreateThread()  在调用进程的地址空间上创建一个线程
ExitThread()  用于结束当前线程
Sleep()  可在指定的时间内挂起当前线程
CreateMutex()  创建一个互斥对象,返回对象句柄
OpenMutex()  打开并返回一个已存在的互斥对象句柄,用于后续访问
ReleaseMutex()  释放对互斥对象的占用,使之成为可用
WaitForSingleObject()  可在指定的时间内等待指定对象为可用状态
InitializeCriticalSection()  初始化临界区对象
EnterCriticalSection()  等待指定临界区对象的所有权
LeaveCriticalSection()  释放指定临界区对象的所有权
CreateSemaphore()  创建一个信号量对象
ReleaseSemaphore()  将所指信号量加上指定大小的一个量

二。读者,写者问题
在Windows 2000/XP环境下,使用多线程和信号量机制实现经典的读者写者问题,每个线程代表一个读者或一个写者。每个线程按相应测试数据文件的要求,进行读写操作。请用信号量机制分别实现读者优先和写者优先的读者-写者问题。
读者-写者问题的读写操作限制:
(1)写-写互斥,即不能有两个写者同时进行写操作
(2)读-写互斥,即不能同时有一个读者在读,同时却有一个写者在写
(3)读-读允许,即可以有二个以上的读者同时读
读者优先的附加限制:如果一个读者申请进行读操作时已有另一读者正在进行读操作,则该读者可直接开始读操作。
写者优先的附加限制:如果一个读者申请进行读操作时已有另一写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作。
运行结果显示要求:要求在每个线程创建、发出读写操作申请、开始读写操作和结束读写操作时分别显示一行提示信息,以确信所有处理都遵守相应的读写操作限制。

3  测试数据文件格式
测试数据文件包括n 行测试数据,分别描述创建的n 个线程是读者还是写者,以及读写操作的开始时间和持续时间。每行测试数据包括四个字段,各字段间用空格分隔。第一字段为一个正整数,表示线程序号。第二字段表示相应线程角色,R 表示读者是,W 表示写者。第三字段为一个正数,表示读写操作的开始时间。线程创建后,延时相应时间(单位为秒)后发出对共享资源的读写申请。第四字段为一个正数,表示读写操作的持续时间。当线程读写申请成功后,开始对共享资源的读写操作,该操作持续相应时间后结束,并释放共享资源。下面是一个测试数据文件的例子:
1 R 3 5
2 W 4 5
3 R 5 2
4 R 6 5
5 W 5.1 3

4  相关API函数
CreateThread()在调用进程的地址空间上创建一个线程
ExitThread()用于结束当前线程
Sleep()可在指定的时间内挂起当前线程
CreateMutex()创建一个互斥对象,返回对象句柄
OpenMutex()打开并返回一个已存在的互斥对象句柄,用于后续访问
ReleaseMutex()释放对互斥对象的占用,使之成为可用
WaitForSingleObject()可在指定的时间内等待指定对象为可用状态
InitializeCriticalSection()初始化临界区对象
EnterCriticalSection()等待指定临界区对象的所有权
LeaveCriticalSection()释放指定临界区对象的所有权

nicolas.shen
需求很明确,你要问什么呢?照着需求一点一点实现就是了

system888net
:em14:  用错标题了?