程序说明:
线程a,b分别从字符串eg中取出一个字符,赋值给字符指针pro.
线程c,d分别从pro中取出字符,并打印
程序用读写锁对线程abcd进行同步
用到的读写锁函数有:
#include<pthread.h> int pthread_rwlock_rdlock(pthread_rwlock_t *rwptr); int pthread_rwlock_wrlock(pthread_rwlock_t *rwptr); int pthread_rwlock_unlock(pthread_rwlock_t *rwptr);
#include <stdio.h> #include <stdlib.h> #include<pthread.h> #include<string.h> #define RDNUM 2 #define WRNUM 2 char eg[]="I'm a test!"; char *pro; struct { int i; pthread_rwlock_t mutex; }shared={ 0,PTHREAD_RWLOCK_INITIALIZER }; void pthw(){ int len=strlen(eg)+1; int write_num=0; for(;;){ pthread_rwlock_wrlock(&shared.mutex); if(shared.i>=len) { pthread_rwlock_unlock(&shared.mutex); break; } pro[shared.i]=eg[shared.i]; shared.i++; write_num++; pthread_rwlock_unlock(&shared.mutex); sleep(1); } printf("进程%lu写了%d个字符 ",pthread_self(),write_num); } void pthr(){ int len=strlen(eg)+1; int read_num=0; for(;;){ pthread_rwlock_rdlock(&shared.mutex); if(shared.i>=len&&read_num==len) { pthread_rwlock_unlock(&shared.mutex); break; } while(read_num<shared.i){ printf("进程%lu读了%c ",pthread_self(),pro[read_num]); read_num++; } pthread_rwlock_unlock(&shared.mutex); } } int main(void) { pthread_t rd[RDNUM],wr[WRNUM]; int i; int len=strlen(eg)+1; pro=(char*)malloc(sizeof(char)*(len+1)); for(i=0;i<WRNUM;i++){ pthread_create(&wr[i],NULL,pthw,NULL); } for(i=0;i<RDNUM;i++){ pthread_create(&rd[i],NULL,pthr,NULL); } for(i=0;i<WRNUM;i++){ pthread_join(wr[i],NULL); } for(i=0;i<RDNUM;i++){ pthread_join(rd[i],NULL); } free(pro); puts("!!!Hello World!!!"); return EXIT_SUCCESS; }
运行结果: