① 用C写读者写者问题
本人也正在做,可以探讨,下面是在网上找的
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/* ==========宏定义部分========== */
#define FootLoc(p) (p+p->size-1)// 指向p所指结点的底部
#define MINSIZE 10 // 空闲区域最小的底限
#define INITSIZE 500 // 初始化存储空间的大小
#define Status int // 返回状态
#define OK 1 // 正确返回值
#define ERROR 0 // 错误返回
#define NUM 20 // 内存最大个数
/* ==========结构定义部分========== */
typedef struct WORD // 内存字类型
{
union // head和foot分别是结点的第一个字和最后一个字
{
WORD *link; // 头部域,指向前趋结点
WORD *uplink; // 底部域,指向本结点头部
};
int tag; // 块标志,0:空闲,1:占用,头部和尾部均有
int size; // 头部域,块大小
WORD *rlink; // 头部域,指向后继结点
// char flag[10];
}WORD,head,foot,*Space; // *Space:可利用空间指针类型
typedef struct ProcInf // 分配的进程信息
{
Space Sp_Head; // 进程分配到的内存地址
char name[15]; // 进程描述标识
struct ProcInf *next; // 链表指针
}ProcInf;
/* =============函数声明部分============ */
Space InitMem( int n );
Space AllocBoundTag( WORD *pav, int n );
Status RecycleAlg(Space p,Space pav);
Space DuSort( WORD *pav );
void Insert(WORD *pav,WORD *p);
Space DelNode(ProcInf *h,char id[15]);
Status InsertProInf(ProcInf *h, Space inser, char id[15]);
int main(int argc, char* argv[])
{
WORD *p,*Ret_Proc_Add,*Rec; // p存放申请内存地址的头指针
ProcInf *pi_h = NULL; // 运行进程链表头指针
int i;
int Num;
int size;
int n = INITSIZE;
char id[15]; // 存放进程标识
pi_h= (ProcInf *)malloc(sizeof(ProcInf)); // 初始化运行进程链表头结点
pi_h ->next =NULL;
p = InitMem(n); // 初始化申请的内存空间,刚开始为一整块空白内存大小为n
if(!p) // 判断是否申请成功,失败结束运行
{
printf("内存初始化失败!\n");
exit(1);
}
//测试用例
// 输入要创建进程的个数
printf("要申请的空间个数及其每一个空间所需要的存储空间:\n");
scanf("%d",&Num);
for( i = 0; i < Num; i++ )
{
L: printf("第%d个空间的存储空间和空间的ID:",i+1);
scanf("%d%s",&size,id);
getchar(); // 吸收回车符号
Ret_Proc_Add = AllocBoundTag( p, size );// 内存分配大小为size
if(!Ret_Proc_Add) // 判断内存是否分配成功
{
printf("内存可能不足,分配失败,重新输入.\n");
goto L;
}
InsertProInf(pi_h,Ret_Proc_Add,id); // 插入到已经分配的内存链表当中
printf("分配内存标识:%s,首地址:0x%x,大小:%d\n",id,Ret_Proc_Add,Ret_Proc_Add ->size);
}
for( i = 0; i < Num; i++ )
{
printf("输入要回收结点的名字:");
scanf("%s",id);
getchar();
Rec = DelNode(pi_h,id);
if(!Rec)
{
printf("输入结点无效,请重新输入.\n");
--i;
}
else
RecycleAlg(Rec,p);
}
getchar();
return 0;
}
Space DelNode(ProcInf *h,char id[15])
{
ProcInf *t,*p;
p = h ->next;
t = h;
if( !p )
{
printf("此空间不存在!\n");
return NULL;
}
while(p ->next!=NULL && strcmp(id,p->name))
{
t = p;
p = p->next;
}
if( p ->next!=NULL )
{
t ->next = p->next;
return p ->Sp_Head;
}
else if(!strcmp(id,p->name))
{
t ->next = p ->next;
return p->Sp_Head;
}
else
{
printf("此空间不存在!\n");
return NULL;
}
}
Status InsertProInf(ProcInf *h,Space inser,char id[15])
{
ProcInf *t,*p;
p = h->next;
if( h->next == NULL )
{
if(!(t = (ProcInf *)malloc(sizeof(ProcInf))))
return ERROR;
t ->Sp_Head = inser;
strcpy( t ->name,id);
t ->next = NULL;
p = t;
h ->next = p;
return OK;
}
else
{
if(!(t = (ProcInf *)malloc(sizeof(ProcInf))))
return ERROR;
t ->Sp_Head = inser;
strcpy( t ->name,id);
t ->next = NULL;
while(p->next)
p = p->next;
p ->next = t;
return OK;
}
}
Space InitMem( int n ) // 初始化分配可利用内存的大小
{
Space p;
p = (Space)malloc(n*sizeof(WORD));
if( p )
{
p ->tag = 0; // 设置使用标志为:未使用
p ->size = n; // 设置大小
p ->rlink = p ->link = p;// 初始化指针
p ->uplink = p; //指向本身
return p;
}
else
return ERROR; // 分配失败
}
Space AllocBoundTag( WORD *pav, int n ) // 若有不小于n的空闲块,则分配相应的存
{ // 储块,并返回其首地址;否则返回空,若
Space p,f; // 分配后可利用空间表不空,则pav指向表中刚分配过的结点的后继结点。
// 查找不小于n的空闲块
for( p = pav; p && p->size < n && p->rlink != pav; p = p->rlink );
if( !p || p->size < n )
return NULL; // 查找失败返回空指针
else // p指向找到的空闲块
{
f = FootLoc(p); // f指向此空闲块的底部
pav = p->rlink; // pav指向*p结点的后继结点
if( p->size-n <= MINSIZE ) // 整块分配,不保留<=MINSIZE的剩余量
{
if( pav == p ) // 如果可利用空间表变为空表,则置pav为空
pav=NULL;
else
{ // 在表中删除分配的结点
pav->link = p->link;
p->link->rlink=pav;
}
p->tag = f->tag = 1;// 修改分配节点的头部和底部的标志
}
else // 分配该块的后n个字
{
f->tag = 1; // 修改分配块的底部标志
p->size -= n; // 置剩余块的大小
f = FootLoc(p); // 指向剩余块的底部
f->tag = 0;f->uplink = p;//设置剩余块的底部
p = f + 1; // 指向分配块的头部
p->tag = 1; // 设置分配块头部
p->size = n; // 设置分配块的大小
}
return p; // 返回分配块首地址
}
}
Status RecycleAlg(Space p,Space pav) // 回收算法
{
Space f,q,ql,t,s;
int n;
if( (p-1)->tag != 0 && (p+p->size)->tag != 0 )
{
// 释放块的左右邻区均为占用块
printf("释放块的左右邻区均为占用块.\n");
p -> tag = 0;
FootLoc(p) ->uplink = p;
FootLoc(p) ->tag = 0;
if( !pav )
pav = p ->link = p ->rlink = p;
else
{
q = pav ->link;
p ->rlink = pav;
p ->link = q;
q ->rlink = pav ->link = p;
pav = p; // 令刚释放的结点为下次分配时的最先查询结点
}
}
if((p-1)->tag == 0 && (p+p->size)->tag != 0)
{
// 释放块左邻区为空闲块
printf("释放块左邻区为空闲块.\n");
n = p ->size; // 释放块的大小
s = (p-1)->uplink; // 左空闲块的的头部地址
s ->size += n; // 设置新的空闲块的大小
f = p + n - 1; // 设置新的空闲块的底部
f ->uplink = s;
f ->tag = 0;
}
if( (p+p->size)->tag==0 && (p-1)->tag != 0 )
{
//释放块的右邻区为空闲块
printf("释放块的右邻区为空闲块.\n");
t = p + p ->size; // 右邻空闲块的头部地址
p ->tag = 0; // p为合并后的结点头部地址
q =t ->link;
p ->link = q;
q ->rlink = p;
ql = t ->rlink;
p ->rlink = ql;
ql ->link = p;
p ->size += t->size;
FootLoc(t) -> uplink = p;
}
if((p-1)->tag == 0 && (p+p->size)->tag == 0)
{
// 释放块的左右邻块均为空闲块
printf("释放块的左右邻块均为空闲块.\n");
n = p->size;
s = (p-1)->uplink;
t = p+p->size;
s ->size += n + t ->size;
q = t ->link;
ql = t ->rlink;
q ->rlink = ql;
ql ->link = q;
FootLoc(t) ->uplink = s;
}
return 0;
}
Space DuSort( WORD *pav ) // 双链表排序
{
Space p,q;
p = NULL;
q = pav ->rlink;
if(!pav) return NULL; // 如果为空链表,则返回空
while(q -> rlink != q->link) //
{
pav->link->rlink = pav->rlink;
pav->rlink->link = pav->link;
Insert(p,pav);
pav = q;
q = q->rlink;
}
Insert(p,q); // 将最后一个结点插入
return p;
}
void Insert(WORD *pav,WORD *p) // 插入排序,按照可用大小从小到大
{
WORD *t;
t = pav;
if(!pav)
{
pav = p;
pav ->rlink = pav ->link;
}
else
{
while(t->size<p->size)
{
t = t->rlink;
}
p ->rlink =t;
p ->link = t->link;
t ->link->rlink = p;
t ->link = p;
}
}
② 用信号量实现读写者同步问题,求详细程序,VC下可以运行的~
// 最近正好也关注这个问题,下面是我的实现,主要参考自windows 内核实验教程
#include "windows.h"
#include <conio.h>
#include <stdlib.h>
#include <fstream.h>
#include <io.h>
#include <string.h>
#include <stdio.h>
#include "winbase.h"
#define READER 'R' // 读者
#define WRITER 'W' // 写者
#define INTE_PER_SEC 1000 // 每秒时钟中断的数目
#define MAX_THREAD_NUM 64 // 最大线程数
int nReaderCnt = 0; // 读者计数
int nWriterCnt = 0; // 写者计数
// 使用信号量代替临界区
HANDLE hWrite = ::CreateSemaphore( NULL, 1, 1, NULL ); // 写开始信号
HANDLE hRead = ::CreateSemaphore( NULL, 1, 1, NULL ); // 读开始信号
// 计数器的互斥保护
HANDLE hRCMutex = ::CreateMutex( NULL, FALSE, NULL );
HANDLE hWCMutex = ::CreateMutex( NULL, FALSE, NULL );
// 在写优先中读信号
HANDLE hReadMutex = ::CreateMutex( NULL, FALSE, NULL );
// 从测试数据文件中获取的线程信息
struct ThreadInfo
{
ThreadInfo()
{
nSerialNo = 0;
cType = '^';
dDelayTime = 0.0;
dOpeTime = 0.0;
}
int nSerialNo; // 线程序号
char cType; // 线程类别(判断是读者还是写者线程)
double dDelayTime; // 线程延迟时间
double dOpeTime; // 线程读写操作时间
};
///////////////////////////////////////////////////////////////////////////
// 读者优先---读者线程
// P:读者线程信息
void RP_ReaderThread(void *p)
{
// 线程序号
int nSerialNo = ((ThreadInfo*)(p))->nSerialNo ;
DWORD dwReadTime = (DWORD)(((ThreadInfo*)(p))->dOpeTime * INTE_PER_SEC );
DWORD dwDelay = (DWORD)(((ThreadInfo*)(p))->dDelayTime * INTE_PER_SEC );
Sleep( dwDelay );
printf("Reader thread %d sents the reading require.\n",nSerialNo);
// 读者数目增加
WaitForSingleObject( hRCMutex, INFINITE );
nReaderCnt++;
if( nReaderCnt == 1 )
{
// 第一个读者, 写保护信号,实现读写互斥
WaitForSingleObject( hWrite, INFINITE );
}
ReleaseMutex(hRCMutex);
// 读文件
printf( "Reader thread %d begins to read file.\n", nSerialNo );
Sleep( dwReadTime );
printf( "Reader thread %d finished reading file.\n", nSerialNo );
// 读者数目减少
WaitForSingleObject( hRCMutex, INFINITE );
nReaderCnt--;
if( nReaderCnt == 0 )
{
// 如果所有的读者读完, 释放写保护信号
ReleaseSemaphore( hWrite, 1, NULL );
}
ReleaseMutex(hRCMutex);
}
//////////////////////////////////////////////////////////////
// 读者优先---写者线程
// P:写者线程信息
void RP_WriterThread(void *p)
{
// 从参数中获得信息
int nSerialNo = ((ThreadInfo*)(p))->nSerialNo ;
DWORD dwWriteTime = (DWORD)(((ThreadInfo*)(p))->dOpeTime * INTE_PER_SEC );
DWORD dwDelay = (DWORD)(((ThreadInfo*)(p))->dDelayTime * INTE_PER_SEC );
Sleep( dwDelay );
printf("Write thread %d sents the writing require.\n",nSerialNo);
// 写保护信号
WaitForSingleObject( hWrite, INFINITE );
//写文件
printf( "Writer thread %d begins to write to the file.\n", nSerialNo );
Sleep( dwWriteTime );
printf( "Write thread %d finished writing to the file.\n", nSerialNo );
ReleaseSemaphore( hWrite, 1, NULL );
}
//////////////////////////////////////////////////////////////
// 读者优先处理函数
// file:文件名
void ReaderPriority( char *file )
{
//线程数目
int nThreadCnt = 0;
//线程ID
DWORD dwThreadID = 0;
// 初始化读写者计数
nReaderCnt = 0;
// 线程对象的数组
HANDLE hThreads[MAX_THREAD_NUM];
ThreadInfo oThreadInfo[MAX_THREAD_NUM];
ifstream inFile;
inFile.open ( file );
printf( "Reader Priority:\n\n" );
while( inFile )
{
// 读入每一个读者,写者的信息
inFile>>oThreadInfo[nThreadCnt].nSerialNo;
inFile>>oThreadInfo[nThreadCnt].cType;
inFile>>oThreadInfo[nThreadCnt].dDelayTime;
inFile>>oThreadInfo[nThreadCnt].dOpeTime;
if ( '^' != oThreadInfo[nThreadCnt].cType )
{
nThreadCnt++;
}
inFile.get();
}
// 创建线程
for( int i = 0; i< nThreadCnt; i++ )
{
if(( oThreadInfo[i].cType==READER ) || ( oThreadInfo[i].cType == 'r' ))
{
// 创建读者进程
hThreads[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(RP_ReaderThread),
&oThreadInfo[i], CREATE_SUSPENDED, &dwThreadID );
}
else
{
// 创建写线程
hThreads[i] = CreateThread( NULL, 0,(LPTHREAD_START_ROUTINE)(RP_WriterThread),
&oThreadInfo[i], CREATE_SUSPENDED, &dwThreadID );
}
}
// 启动线程
for( i = 0; i< nThreadCnt; i++ )
{
ResumeThread( hThreads[i] );
}
// 等待所有的线程结束
WaitForMultipleObjects( nThreadCnt, hThreads, TRUE, INFINITE );
printf( "All reader and writer have finished operating.\n" );
}
////////////////////////////////////////////////////////
// 写者优先---读者线程
// P:读者线程信息
void WP_ReaderThread( void *p )
{
// 从参数中得到信息
int nSerialNo = ((ThreadInfo*)(p))->nSerialNo ;
DWORD dwReadTime = (DWORD)(((ThreadInfo*)(p))->dOpeTime * INTE_PER_SEC );
DWORD dwDelay = (DWORD)(((ThreadInfo*)(p))->dDelayTime * INTE_PER_SEC );
Sleep( dwDelay );
printf("Reader thread %d sents the reading require.\n",nSerialNo);
// 读信号互斥保护
WaitForSingleObject( hReadMutex, INFINITE );
// 读信号
WaitForSingleObject( hRead, INFINITE );
// 增加读者计数
WaitForSingleObject( hRCMutex, INFINITE );
nReaderCnt++;
if(nReaderCnt==1)
{
// 如果是第1个读者, 写信号,以实现读写互斥
WaitForSingleObject( hWrite, INFINITE );
}
ReleaseMutex( hRCMutex );
ReleaseSemaphore( hRead, 1, NULL );
ReleaseMutex( hReadMutex );
// 读文件
printf( "Reader thread %d begins to read file.\n", nSerialNo );
Sleep( dwReadTime );
printf( "Reader thread %d finished reading file.\n", nSerialNo );
// 减少读者计数
WaitForSingleObject( hRCMutex, INFINITE );
nReaderCnt--;
if( nReaderCnt == 0 )
{
// 最后一个读者, 唤醒写者
ReleaseSemaphore( hWrite, 1, NULL );
}
ReleaseMutex( hRCMutex );
}
///////////////////////////////////////////
// 写者优先---写者线程
// P:写者线程信息
void WP_WriterThread( void *p )
{
//从参数中获得信息
int nSerialNo = ((ThreadInfo*)(p))->nSerialNo;
DWORD dwWriteTime = (DWORD)(((ThreadInfo*)(p))->dOpeTime * INTE_PER_SEC );
DWORD dwDelay = (DWORD)(((ThreadInfo*)(p))->dDelayTime * INTE_PER_SEC );
Sleep( dwDelay );
printf("Writer thread %d sents the writing require.\n",nSerialNo);
// 增加写者计数
WaitForSingleObject( hWCMutex, INFINITE );
nWriterCnt++;
if( nWriterCnt == 1 )
{
// 为实现写者优先,获取读信号,从而阻塞读线程
WaitForSingleObject( hRead, INFINITE );
}
ReleaseMutex(hWCMutex);
// 写信号
WaitForSingleObject( hWrite, INFINITE );
printf( "Writer thread %d begins to write to the file.\n", nSerialNo );
Sleep( dwWriteTime );
printf( "Writer thread %d finished writing to the file.\n", nSerialNo );
ReleaseSemaphore( hWrite, 1, NULL );
// 减少写者计数
WaitForSingleObject( hWCMutex, INFINITE );
nWriterCnt--;
if( nWriterCnt == 0 )
{
ReleaseSemaphore( hRead, 1, NULL );
}
ReleaseMutex(hWCMutex);
}
/////////////////////////////////////////////
// 写者优先处理函数
// file:文件名
void WriterPriority( char * file )
{
int nThreadCnt = 0;
DWORD dwThreadID;
HANDLE hThreads[MAX_THREAD_NUM];
ThreadInfo oThreadInfo[MAX_THREAD_NUM];
nReaderCnt=0;
nWriterCnt=0;
ifstream inFile;
inFile.open (file);
printf("Writer priority:\n\n");
while(inFile)
{
inFile>>oThreadInfo[nThreadCnt].nSerialNo;
inFile>>oThreadInfo[nThreadCnt].cType;
inFile>>oThreadInfo[nThreadCnt].dDelayTime;
inFile>>oThreadInfo[nThreadCnt].dOpeTime;
if ( '^' != oThreadInfo[nThreadCnt].cType )
{
nThreadCnt++;
}
inFile.get();
}
// 创建线程
for( int i = 0 ;i < nThreadCnt; i++ )
{
if(( oThreadInfo[i].cType == READER ) || ( oThreadInfo[i].cType == 'r' ))
{
//创建读者进程
hThreads[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(WP_ReaderThread),
&oThreadInfo[i], CREATE_SUSPENDED, &dwThreadID );
}
else
{
//创建写线程
hThreads[i] = CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE)(WP_WriterThread),
&oThreadInfo[i],CREATE_SUSPENDED,&dwThreadID);
}
}
// 启动线程
for( i = 0; i< nThreadCnt; i++ )
{
ResumeThread( hThreads[i] );
}
// 等待所有的线程结束
WaitForMultipleObjects( nThreadCnt, hThreads, TRUE, INFINITE );
printf("All reader and writer have finished operating.\n");
}
/////////////////////////////////////////////////////
//主函数
int main(int argc,char *argv[])
{
char ch;
while(true)
{
printf("*************************************\n");
printf(" 1.Reader Priority\n");
printf(" 2.Writer Priority\n");
printf(" 3.Exit to Windows\n");
printf("*************************************\n");
printf("Enter your choice(1,2,3): ");
do{
ch=(char)_getch();
}while(ch!='1'&&ch!='2'&&ch!='3');
system("cls");
if(ch=='3')
return 0;
else if(ch=='1')
ReaderPriority("thread.dat");
else
WriterPriority("thread.dat");
printf("\nPress Any Key to Coutinue:");
_getch();
system("cls");
}
return 0;
}
我可以帮助你,你先设置我最佳答案后,我网络Hii教你。
③ c语言如何实现对txt文件的读取和写入
1、使用VS新建空工程,直接点击确定,如下所示。
④ 如何用信号量机制解决读者写者、生产者消费者问题(C语言)
你到这个连接看看·里面写的很详细的http://wenda.tianya.cn/wenda/thread?tid=225a1aad2c438c22&hl=fi
⑤ C语言中文件的读写实际过程
RB和R本质上是二进制数据流,但用于文本的二进制数据的含义是ASCII或其他内部代码。R/W和Rb/WB之间的一个重要区别是,R/W的文本换行格式在不同的系统上是不同的(DOS/windows下的回车字符Cr('\R')+换行字符LF('\n')、UNIX/Linux下的LF和MAC下的Cr),这导致文件操作的细节不同(例如,通过fput和fprintf处理字符串的结尾)。
具体的读写实现由库函数处理,WB/RB模式一般采用缓冲区读写,最终实现对外部内存文件或其他输入/输出流的抽象(包括在内存中建立缓冲区)。在此基础上,w/R模式处理了上述一些差异。通常,缓冲区的操作取决于库函数的实现。用户无法看到库函数,因为它是不必要的(无法保证不同平台的实现是一致的)。
对于标准输入设备,如键盘,它被抽象为标准输入流stdin。除了抽象过程本身(由底层系统实现)外,实现方法与从外部存储文件读取之间没有本质区别。
⑥ 计算机操作系统中管程机制如何实现读者写者
管程实现读者写者算法
管程:bulletin =MODULE ;(假设已实现一基本管程monitor,同时提供了enter,leave,signal,wait等操作)
r,w:condition;
-r 控制读者使用资源, w 控制写者使用资源;
writing:boolean;
-当前写者是否使用资源;
read_account:integer;
define start_read,end_read,start_writer,end_writer;
use monitor.enter,monitor.leave,monitor.wait,monitor.signal;
procere start_read();
{ if (writing) monitor.wait(r);
read_account++;
monitor.signal(r);}
procere end_read();
{read_account--;
if(read_account =0) monitor.signal(w); }
procere start_write();
{ if(read_account<>0) or writing);
monitor.wait(w);
writing=true;
procere end_write();
{ writing=fasle;
if(r<>NULL) monitor.signal(r);
else monitor.signal(w); }
根据上述定义的一系列过程,给出改进后的读者写者算法。
读者写者算法如下:
reader-(读者进程):
{
while(true)
{
bulletin.enter();
bulletin.start_read();
read();
bulletin.end_read();
bulletin.leave();}
}
writer-(写者进程):
{
while(ture)
{
bulletin.enter();
bulletin.start_write();
write();
bulletin.end_write();
bulletin.leave();}
}
⑦ 用c语言或c++编写编程实现生产者消费者或读写者的同步问题
实现一个队列CQueue
CQueue提供两个公有成员函数
addTail():往队列尾部增加一个元素
removeHead():读出并移除队列的第一个元素
生产者:两个线程通过调用CQueue::addTail()往队列中增加元素
消费者:一个线程通过调用CQueue::removeHead()从队列中读取元素
#include <iostream>
#include <list>
#include <windows.h>
#include <process.h>
using namespace std;
#define P(sem) WaitForSingleObject(sem,INFINITE)
#define V(sem) ReleaseSemaphore(sem,1,NULL)
class CQueue
{
public:
void addTail();//往队列尾部增加一个元素
void removeHead();//读出并移除队列的第一个元素
private:
list<int> L;
};
CQueue buffer;//全局的缓冲区
const int buf_size = 10;//缓冲区大小
static int GOODS_ID = 0;//商品序号
const int procers = 3;//生产者数量
const int consumers = 8;//消费者数量
void ProcerThread(void* param);
void ConsumerThread(void* param);
HANDLE empty,occupy,op_mutex;
int main()
{
int i;
int p_id[procers],c_id[consumers];
occupy = CreateSemaphore(NULL,0,buf_size,NULL);//占用位置
empty = CreateSemaphore(NULL,buf_size,buf_size,NULL);//空余位置
op_mutex = CreateSemaphore(NULL,1,1,NULL);//操作互斥量
for(i=0;i<procers;++i)
{
p_id[i] = i+1;
_beginthread(ProcerThread,0,p_id+i);
}
for(i=0;i<consumers;++i)
{
c_id[i] = i+1;
_beginthread(ConsumerThread,0,c_id+i);
}
while(getchar()=='\n') break;
return 0;
}
void CQueue::addTail()
{
L.insert(L.end(),++GOODS_ID);
}
void CQueue::removeHead()
{
cout<<*L.begin()<<endl;
L.erase(L.begin());
}
void ProcerThread(void* param)
{
int id = *(int*)param;
while(1)
{
P(empty);
P(op_mutex);
Sleep(100);
buffer.addTail();
printf("Procer_%d proced %d\n",id,GOODS_ID);
V(op_mutex);
V(occupy);
}
}
void ConsumerThread(void* param)
{
int id = *(int*)param;
while(1)
{
P(occupy);
P(op_mutex);
Sleep(100);
printf("Consumer_%d consumed ",id);
buffer.removeHead();
V(op_mutex);
V(empty);
}
}
⑧ 读者-写者实现
设置互斥信号量wmutex 表示写者间、读者和写者间互斥
用readcount变量来记录读者数
Var rmutex,wmutex: semaphore:=1,1 ;
readcount :integer :=0 ;
begin
parbegin
reader:begin
repeat
P(rmutex)
if readcount=0 then P(wmutex);
readcount=readcount+1;
V(rmutex)
read text
P(rmutex)
readcount=readcount+1;
if readcount=0 then V(wmutex);
V(rmutex)
until false
writer:begin
repeat
P(wmutex);
write text;
V(wmutex);
until false
end
parend
end
⑨ c语言如何用信号量实现读者写者问题,用wait和signal
网络“最全面的linux信号量解析”。
⑩ 用C语言编程实现用信号量实现读者--写者问题(要源代码)
汗 竟然是校友...
by monkeyking