标签:
1 /* 2 *读者写者问题 3 *问题描述 4 *1)允许多位读者同时访问某数据,但是同一时间,只允许一位写者写入数据 5 *2)当没有读者在读取数据的时候,才允许写者写入数据 6 *3)当有写者正在写入数据的时候,不允许读者进行数据的读写 7 *History: 8 *2010/03/16 huangwei First release 9 */ 10 11 #include<stdio.h> 12 #include<unistd.h> 13 #include<pthread.h> 14 15 #define READER_MAX 3 /*最多允许多少人一起读取数据*/ 16 #define WRITER_MAX 2 /*最多允许多少人写数据*/ 17 18 pthread_rwlock_t rw_lock; /*读写锁*/ 19 20 /** 21 *reader_thread - 模拟读者进行数据读取 22 *@arg : 没有使用 23 */ 24 25 void* reader_thread(void *arg) 26 { 27 while(1) { 28 /*尝试加只读锁*/ 29 if(pthread_rwlock_tryrdlock(&rw_lock)) { 30 /*加只读锁不成功,打印信息,1秒钟后继续尝试*/ 31 printf("读\t者%u暂时不能读取数据.\n", (unsigned int)pthread_self()); 32 sleep(1); 33 } else { 34 /*加只读锁成功,显示哪位读者正在进行数据读取*/ 35 printf("读\t者%u正在读取数据.\n", (unsigned int)pthread_self()); 36 sleep(1); /*读者正在读取数据*/ 37 printf("读\t者%u读取数据完毕.\n", (unsigned int)pthread_self()); 38 pthread_rwlock_unlock(&rw_lock); /*解只读锁*/ 39 sleep(2); /*休息一段时间后再尝试进行数据读取*/ 40 } 41 } 42 } 43 44 /** 45 *writer_thread - 模拟写者写入数据 46 *@arg : 没有使用 47 */ 48 49 void* writer_thread(void *arg) 50 { 51 while(1) { 52 /*尝试加写锁*/ 53 if(pthread_rwlock_trywrlock(&rw_lock)) { 54 /*加写锁不成功,输出信息,2秒后再继续尝试*/ 55 printf("写者%u暂时不能写入数据\n", (unsigned int)pthread_self()); 56 sleep(2); 57 } else { 58 /*加写锁成功,显示目前哪为写者正在进行数据写入*/ 59 printf("写者%u正在写入数据.\n", (unsigned int)pthread_self()); 60 sleep(2); /*写者正在写入数据*/ 61 printf("写者%u写入数据完毕.\n", (unsigned int)pthread_self()); 62 pthread_rwlock_unlock(&rw_lock); 63 sleep(3); /*休息一段时间后再尝试进行数据写入*/ 64 } 65 } 66 } 67 68 int main(int argc, char* argv[]) 69 { 70 pthread_t reader, writer;/*记录读者和写者的线程号*/ 71 72 int i = 0;/*循环变量*/ 73 74 pthread_rwlock_init(&rw_lock, NULL); /*初始化读写锁*/ 75 76 /*创建READER_MAX个读者*/ 77 for(i = 0; i < READER_MAX; i++) 78 pthread_create(&reader, NULL, (void *)reader_thread, NULL); 79 80 /*创建WRITER_MAX个读者*/ 81 for(i = 0; i < WRITER_MAX; i++) 82 pthread_create(&writer, NULL, (void *)writer_thread, NULL); 83 84 sleep(10);/*程序运行10秒后退出*/ 85 86 return 0; 87 }
程序运行结果:
1 读 者3434592000正在读取数据. 2 读 者3426199296正在读取数据. 3 读 者3417802496正在读取数据. 4 写者3409409792暂时不能写入数据 5 写者3401017088暂时不能写入数据 6 读 者3434592000读取数据完毕. 7 读 者3417802496读取数据完毕. 8 读 者3426199296读取数据完毕. 9 写者3409409792正在写入数据. 10 写者3401017088暂时不能写入数据 11 读 者3434592000暂时不能读取数据. 12 读 者3426199296暂时不能读取数据. 13 读 者3417802496暂时不能读取数据. 14 写者3409409792写入数据完毕. 15 写者3401017088正在写入数据. 16 读 者3434592000暂时不能读取数据. 17 读 者3417802496暂时不能读取数据. 18 读 者3426199296暂时不能读取数据. 19 读 者3426199296暂时不能读取数据. 20 读 者3417802496暂时不能读取数据. 21 读 者3434592000暂时不能读取数据. 22 写者3401017088写入数据完毕. 23 读 者3426199296正在读取数据. 24 读 者3417802496正在读取数据. 25 读 者3434592000正在读取数据. 26 写者3409409792暂时不能写入数据 27 读 者3426199296读取数据完毕. 28 读 者3434592000读取数据完毕. 29 读 者3417802496读取数据完毕. 30 写者3409409792正在写入数据. 31 写者3401017088暂时不能写入数据 32 读 者3417802496暂时不能读取数据. 33 读 者3426199296暂时不能读取数据. 34 读 者3434592000暂时不能读取数据.
标签:
原文地址:http://www.cnblogs.com/wireless-dragon/p/5189259.html