
操作系统-C语言实现读者写者问题(写者优先).pdf
4页操作系统-C语实现读者写者问题(写者优先)同步互斥问题 - 读者写者问题之写者优先问题要求:读者-写者问题的读写操作限制(仅读者优先或写者优先):写-写互斥,即不能有两个写者同时进写操作读-写互斥,即不能同时有个线程在读,另个线程在写读-读允许,即可以有个或多个读者在读写者优先的附加限制:如果个读者申请进读操作时已有另写者在等待访问共享资源,则该读者必须等到没有写者处于等待状态后才能开始读操作写者优先实现思路:写者优先与读者优先类似不同之处在于旦个写者到来,它应该尽快对件进写操作,如果有个写者在等待,则新到来的读者不允许进读操作为此应当添加个整型变量write_count,于记录正在等待的写者的数,当write_count=0时,才可以释放等待的读者线程队列为了对全局变量write_count实现互斥,必须增加个互斥对象mutex2为了实现写者优先,应当添加个临界区对象read,当有写者在写件或等待时,读者必须阻塞在read上同样,有读者读时,写者必须等待于是,必须有个互斥对象RW_mutex来实现这个互斥有写者在写时,写者必须等待读者线程要对全局变量read_count实现操作上的互斥,必须有个互斥对象命名为mutex1。
实现代码:代码中信号量解析:设置五个信号量,分别是RWMutex, mutex1, mutex2, mutex3, wrt,两个全局整型变量writeCount, readCount信号量mutex1在写者的进区和退出区中使,使得每次只有个写者对其相应进区或推出区进操作,主要原因是进区和退出区存在对变量writeCount的修改,每个写者其进区中writeCount加1,退出区中writeCount减1信号量RWMutex则是读者和写者两个之间的互斥信号量,保证每次只读或者只写写者优先中,写者的操作应该优先于读者,则信号量直被占着,直到没有写者的时候才会释放,即当writeCount等于1的时候,申请信号量RWMutex,其余的写者需再次申请,但是写者是不能同时进写操作的,则需要设置个信号量wrt来保证每次只有个写者进写操作,当写者的数量writeCount等于0的时候,则证明此时没有没有读者了,释放信号量RWMutex信号量mutex2防次多个读者修改readCount当readCount为1的时候,为阻写者进写操作,申请信号量wrt,则写者就法进写操作了信号量mutex3的主要处就是避免写者同时与多个读者进竞争,读者中信号量RWMutexmutex3先释放,则旦有写者,写者可马上获得资源。
实现代码:/* 写者优先*/# include # include # include # include # include # include # include # include /semaphoressem_t RWMutex, mutex1, mutex2, mutex3, wrt;int writeCount, readCount;struct data int id; int opTime; int lastTime;/读者void* Reader(void* param) int id = (struct data*)param)-id; int lastTime = (struct data*)param)-lastTime; int opTime = (struct data*)param)-opTime; sleep(opTime); printf(Thread %d: waiting to readn, id); sem_wait(&mutex3); sem_wait(&RWMutex); sem_wait(&mutex2); readCount+; if(readCount = 1) sem_wait(&wrt); sem_post(&mutex2); sem_post(&RWMutex); sem_post(&mutex3); printf(Thread %d: start readingn, id); /* reading is performed */ sleep(lastTime); printf(Thread %d: end readingn, id); sem_wait(&mutex2); readCount-; if(readCount = 0) sem_post(&wrt); sem_post(&mutex2); pthread_exit(0);/写者void* Writer(void* param) int id = (struct data*)param)-id; int lastTime = (struct data*)param)-lastTime; int opTime = (struct data*)param)-opTime; sleep(opTime); printf(Thread %d: waiting to writen, id); sem_wait(&mutex1); writeCount+; if(writeCount = 1) sem_wait(&RWMutex); sem_post(&mutex1); sem_wait(&wrt); printf(Thread %d: start writingn, id); /* writing is performed */ /* writing is performed */ sleep(lastTime); printf(Thread %d: end writingn, id); sem_post(&wrt); sem_wait(&mutex1); writeCount-; if(writeCount = 0) sem_post(&RWMutex); sem_post(&mutex1); pthread_exit(0);int main() /pthread pthread_t tid; / the thread identifier pthread_attr_t attr; /set of thread attributes /* get the default attributes */ pthread_attr_init(&attr); /initial the semaphores sem_init(&mutex1, 0, 1); sem_init(&mutex2, 0, 1); sem_init(&mutex3, 0, 1); sem_init(&wrt, 0, 1); sem_init(&RWMutex, 0, 1); readCount = writeCount = 0; int id = 0; while(scanf(%d, &id) != EOF) char role; /producer or consumer int opTime; /operating time int lastTime; /run time scanf(%c%d%d, &role, &opTime, &lastTime); struct data* d = (struct data*)malloc(sizeof(struct data); d-id = id; d-opTime = opTime; d-lastTime = lastTime; if(role = R) printf(Create the %d thread: Readern, id); pthread_create(&tid, &attr, Reader, d); else if(role = W) printf(Create the %d thread: Writern, id); pthread_create(&tid, &attr, Writer, d); sem_destroy(&mutex1); sem_destroy(&mutex2); sem_destroy(&mutex3); sem_destroy(&RWMutex); sem_destroy(&wrt); return 0;测试测试数据:1 R 3 52 W 4 53 R 5 24 R 6 55 W 7 3测试结果:。












