C语言---多个
线程读取
文件,其代码如下:#include#include#include#include#include#include #define THREAD_NUM 25typedef struct{undefinedFILE *_fpint _nThreadId//第几个线程sem_t *_semLock}IDD_THREAD_PARAMvoid *ThreadFunc(void *args){undefinedchar sLine[100+1]FILE *fpRead = ((IDD_THREAD_PARAM *)args)->_fpsem_t *semLock = ((IDD_THREAD_PARAM *)args)->_semLockint nId = ((IDD_THREAD_PARAM *)args)->_nThreadIdsem_wait(semLock)while(!feof(fpRead)){undefinedmemset(sLine,0,sizeof(sLine))fgets(sLine,100,fpRead)fprintf(stderr,"Thread ID-%d:%s",nId,sLine)}sem_post(semLock)}int main(){undefinedpthread_t *pThreadssem_t semLockpThreads = (pthread_t *)malloc(THREAD_NUM*sizeof(pthread_t))sem_init(&semLock,0,1)FILE *fp = fopen("test.txt","r")//开始线程循环IDD_THREAD_PARAM paramfor(int i=0i{undefinedmemset(param,0,sizeof(IDD_THREAD_PARAM))param._fp = fpparam._nThreadId = iparam._semLock = &semLockpthread_create((pThreads+i),NULL,ThreadFunc,param)}for(int i=0ipthread_join(*(pThreads+i),NULL)free(pThreads)pThreads = NULLfclose(fp)fp = NULLreturn 0}不可行。每次读取文件都需要创建
缓存文件流,很占内存,而且多次读取实际上也是一个文件,还不如直接读取文件,之后通过条件多次获取需要的内容来的实际。
可以通过BufferedReader
流的形式进行流缓存,之后通过readLine方法获取到缓存的内容。
BufferedReader
bre
=
null
try
{
String
file
=
"D:/test/test.txt"
bre
=
new
BufferedReader(new
FileReader(file))//此时获取到的bre就是整个文件的缓存流
while
((str
=
bre.readLine())!=
null)
//
判断最后一行不存在,为空结束循环
{
System.out.println(str)//原样输出读到的内容,此处可以添加条件进行不同的处理
};
备注:
流用完之后必须close掉,如上面的就应该是:bre.close(),否则bre流会一直存在,直到程序运行结束。
多线程读取文件在一块硬盘上没用,瓶颈在硬盘I/O,而不在CPU和内存。读取文件时,CPU不用复杂的计算工作,只是数据传输而已,多线程反而造成磁头来回移动,效率不高。如果是两块以上的硬盘,可以用不同的线程访问不同的硬盘,效率比单线程要高
而且多线程 *** 作同一文件除了效率还会有多线程问题,多个线程同时往数组里存数据还会有线程安全问题,如果不同步处理读取的文件就是错误的。
如果读取的话只能设置每个线程各自读取偏 移量
读取文件大小(比如大小是200K)。 2,启动5个线程,第一个线程读到40,第二个线程跳过40在读到80,总之得合理安排好各个线程读取的大小。这样才能不重复读取。大数据处理框架mapreduce原理和此类似
评论列表(0条)