C 语言多线程怎么读文件高效

C 语言多线程怎么读文件高效,第1张

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原理和此类似


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/6082532.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-14
下一篇 2023-03-14

发表评论

登录后才能评论

评论列表(0条)

保存