小弟初学多线程,做了一个读者写者问题的demo来学习这方面的知识。
程序输入的格式是这样的,
2 W 4 5
3 R 5 2
4 R 6 5
5 W 5.1 3
0 w 1 5
贴出完整源代码是为了大家更深入的帮忙解答,但是实际上,大家之用看readerFirst()这一个函数和输出即可发现问题的所在
input前边的第一个数字代表线程的index。w和r用于判断是写者还是读者,最后两个数字用于第一个是线程申请开始的时间,第二个是该操作持续的时间。当输入结束的话第一个数字输入0就可以了.
根据输出,发现我的程序在readerFirst()这个函数的运行并不是并发的,而是根据调用pthread_create的调用的先后顺序运行的,表示很费解,希望高手指正
/* * 多线程,读者优先 */ #include "stdio.h" #include <stdlib.h> #include <pthread.h> #include <time.h> #define N_WRITER 3 //写者数目 #define N_READER 5 //读者数目 #define W_SLEEP 1 //控制写频率 #define R_SLEEP 1 //控制读频率 pthread_t thread[100]; const int MAX_RAND = 1000;//产生的最大随机数 pthread_mutex_t writeLock = PTHREAD_MUTEX_INITIALIZER;//同一时间只能一个人写文件,互斥 pthread_mutex_t accessReaderCnt = PTHREAD_MUTEX_INITIALIZER;//同一时间只能有一个人访问 readerCnt int data = 0; int readerCnt = 0; typedef struct params{ int index; double begin,length; }params; double timeElapsed(){ return (double)clock()/CLOCKS_PER_SEC; } void write() { int rd = rand(); printf("write %d\n",rd); data = rd; } void read() { printf("read %d\n",data); } void * writer(void * in) { params *param=(params *)in; int index=param->index; double begin=param->begin,length=param->length; while(timeElapsed()<begin){ } pthread_mutex_lock(&writeLock); begin=timeElapsed(); printf("at %lf,%d writing thread starts\n",timeElapsed(),index); while(timeElapsed()<begin+length){ } printf("at %lf,%d writing thread ends\n",timeElapsed(),index); pthread_mutex_unlock(&writeLock); sleep(W_SLEEP); pthread_exit((void *) 0); } void * reader (void * in) { params *param=(params *)in; int index=param->index; double begin=param->begin,length=param->length; while(timeElapsed()<begin){ } pthread_mutex_lock(&accessReaderCnt); readerCnt++; if(readerCnt == 1){ pthread_mutex_lock(&writeLock); } pthread_mutex_unlock(&accessReaderCnt); begin=timeElapsed(); printf("at %lf,%d reading thread starts\n",timeElapsed(),index); while(timeElapsed()<begin+length){ } printf("at %lf,%d reading thread ends\n",timeElapsed(),index); pthread_mutex_lock(&accessReaderCnt); readerCnt--; if(readerCnt == 0){ pthread_mutex_unlock(&writeLock); } pthread_mutex_unlock(&accessReaderCnt); sleep(R_SLEEP); pthread_exit((void *) 0); } void readerFirst(){ int threadNumber=0; char flags[100]; struct params param[100]; while(1){ int index; double begin,length; char flag; scanf("%d ",&index); if(!index) break; scanf("%c %lf %lf",&flag,&begin,&length); flags[threadNumber]=flag; param[threadNumber].index=index; param[threadNumber].begin=begin; param[threadNumber].length=length; ++threadNumber; } int index=0; while(index<threadNumber){ if(flags[index]=='W'){ pthread_create(&thread[index],NULL,&writer,¶m[index]); } else{ pthread_create(&thread[index],NULL,&reader,¶m[index]); } printf("%d thread start\n",index); pthread_join(thread[index],NULL); ++index; } } int main() { readerFirst(); return 0; }