/** **读写互斥问题 **读的时候不能写,写的时候不能读 **读写交替 **/ #include<stdio.h> #include<pthread.h> //声明一把互斥锁 pthread_mutex_t mutex; //声明是否有内容可读的标志 int hasContent = 0; void writer(void) { while(1) { pthread_mutex_lock(&mutex); if(hasContent == 0) { printf("writer加锁成功,开始写...\n"); sleep(2); hasContent = 1; printf("writer写操作结束,释放互斥锁\n"); } pthread_mutex_unlock(&mutex); } } void reader(void) { while(1) { pthread_mutex_lock(&mutex); if(hasContent == 1) { printf("reader加锁成功,开始读...\n"); sleep(2); hasContent = 0; printf("reader读操作结束,释放互斥锁\n"); } pthread_mutex_unlock(&mutex); } } int main(void) { printf("初始化互斥锁\n"); pthread_mutex_init(&mutex,NULL); pthread_t thread_writer; pthread_t thread_reader; printf("开始读写线程\n"); pthread_create(&thread_reader,NULL,(void *)reader,NULL); pthread_create(&thread_writer,NULL,(void *)writer,NULL); printf("回收线程\n"); pthread_join(thread_reader,NULL); pthread_join(thread_writer,NULL); printf("运行结束\n"); return 0; }
相比于上一篇文章中的代码,这里最主要的改进就是增加了一个是否有文章可读的变量作为判断标识int hasContent=0,初始化为0表示默认是没有可读的内容的。
当读者线程开始运行后,首先进行加锁,如果加锁成功,判断是否有内容可读,如果没有,则不进行读操作,直接解锁,从而快速让出互斥锁的加锁权,让写者有机会加锁并写入内容。如果有内容可读,则进行读操作。
当写者线程开始运行后,首先进行加锁,如果加锁成功,判断是否内容已经被读者读完了,如果还没被读完,则不进行写操作,直接解锁,从而快速让出互斥锁的加锁权,让读者有机会加锁并读取内容。如果内容已经被读者读完了,则进行写操作。
可以简单理解为这是一种具有长度为1的缓冲区的读者写者问题。