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

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

C语言---多个线程读取文件,其代码如下:

#include

#include

#include

#include

#include

#include

#define THREAD_NUM 25

typedef struct

{undefined

FILE *_fp

int _nThreadId//第几个线程

sem_t *_semLock

}IDD_THREAD_PARAM

void *ThreadFunc(void *args)

{undefined

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))

{undefined

memset(sLine,0,sizeof(sLine))

fgets(sLine,100,fpRead)

fprintf(stderr,"Thread ID-%d:%s",nId,sLine)

}

sem_post(semLock)

}

int main()

{undefined

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=0i

{undefined

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=0i

pthread_join(*(pThreads+i),NULL)

free(pThreads)

pThreads = NULL

fclose(fp)

fp = NULL

return 0

}

1共用一个连接就可以

2其实一样可以用lock实现,把数据库 *** 作写成一个函数,函数内加lock。c#会安排他们排队

比如

private static object privateObjectLock = new object()

public static xxoo()

{

lock(privateObjectLock)

{

//数据 *** 作语句

}

}

}

你在一个函数里实现数据库 *** 作。然后线程 *** 作数据库都调用他

先说几个要点:

a、文件在 *** 作系统级,有描述符标记,关联到打开的文件表项,文件表项纪录了一个很重要的信息,当前文件的指针;

b、cpu要干的工作比读文件快不,读一次文件的速度要慢于cpu处理一次的速度,没必要多多线程,多线程提升不了多少性能,还增加编程的难度,单线程处理即可。

c、待处理文件,必须知道一定的边界值,如分页边界或单条纪录边界。

有了上面的前提,每个线程维护单独的缓冲区,缓存区大小就是c点提到的边界纪录大小。线程启动,把缓冲区读满,处理数据。此处有个要点,必须做文件锁,把要读的边界锁住。否则读出来的数据会产生混乱。(如果强行打开多个不同的文件不划算,内存占用可能会过多)。产生混乱的原因简单,读文件实际上是进行系统调用,系统调用有自己的缓冲区,这缓冲区未必跟你设置的缓冲区一样大。多次读多次移动指针,不加文件锁处理的数据必定会乱。

文件锁两种方式加锁,对整个文件加锁,对字节区间加锁。都不是什么难事。

实现方式1:对整个文件加锁,因为我们要保证的是读到的数据别混乱。

实现方式2:如果内存足够大,维护n个独立的文件描述符,这些文件描述符必须有独立的文件指针, *** 作系统上有对应实现。每个线程 *** 作未读纪录,这么做还需要维护共享的已读纪录指针。防止重复处理。这么做处理完成如果需要按顺序合并文件是难点。处理过的数据有新的纪录边界。要视实际情况而定能不能这么做。写程序要优先保证的是正确性,之后才是提升效率。

我说的理论,依据是 *** 作系统提供的api处理。别的语言要依赖 *** 作系统运行。原理差不多,目标语言有没有 *** 作系统提供的api强悍。依据使用的目标语言而定。绝大多数能叫编程语言的语言都会提供 *** 作系统api对应的方法。(脚本语言例外,如shell,perl,javascript,vbscript,就可能没这么强的控制能力。),java,objective-c,swift,php,python一般是不会有问题的。


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

原文地址: http://outofmemory.cn/sjk/10699017.html

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

发表评论

登录后才能评论

评论列表(0条)

保存