文档章节

C语言---多个线程读取文件

暖冰
 暖冰
发布于 2015/11/16 18:40
字数 163
阅读 705
收藏 5
#include<pthread.h>  
#include<stdio.h>  
#include<stdlib.h>  
#include<string.h>  
#include<semaphore.h>  
#include <unistd.h>  
#define THREAD_NUM 25  
typedef 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;  
}