C语言---多个线程读取文件
来源:互联网 发布:linux opengl 版本 编辑:程序博客网 时间:2024/05/01 19:29
#include<pthread.h>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<semaphore.h>#include <unistd.h>#define THREAD_NUM 25typedef struct{ FILE *_fp; int _nThreadId;//第几个线程 sem_t *_semLock;}IDD_THREAD_PARAM;void *ThreadFunc(void *args){ char sLine[100+1]; FILE *fpRead = ((IDD_THREAD_PARAM *)args)->_fp; sem_t *semLock = ((IDD_THREAD_PARAM *)args)->_semLock; int nId = ((IDD_THREAD_PARAM *)args)->_nThreadId; sem_wait(semLock); while(!feof(fpRead)) { memset(sLine,0,sizeof(sLine)); fgets(sLine,100,fpRead); fprintf(stderr,"Thread ID-%d:%s",nId,sLine); } sem_post(semLock);}int main(){ pthread_t *pThreads; sem_t semLock; pThreads = (pthread_t *)malloc(THREAD_NUM*sizeof(pthread_t)); sem_init(&semLock,0,1); FILE *fp = fopen("test.txt","r"); //开始线程循环 IDD_THREAD_PARAM param; for(int i=0;i<THREAD_NUM;i++) { memset(param,0,sizeof(IDD_THREAD_PARAM)); param._fp = fp; param._nThreadId = i; param._semLock = &semLock; pthread_create((pThreads+i),NULL,ThreadFunc,param); } for(int i=0;i<THREAD_NUM;i++) pthread_join(*(pThreads+i),NULL); free(pThreads); pThreads = NULL; fclose(fp); fp = NULL; return 0;}