文件管理 · 2023年11月9日

多线程写入文件|linux 多线程把内存中的内容写入文件怎样效

⑴ linux 多线程把内存中的内容写入文件怎样效

普通磁盘单线程4KB每write最快,同时写多文件的话注意做内存cache到足够大后顺序写出到单文件,避免频繁在文件间切换引起磁道滑动。

⑵ java多线程读写文件

public static void main(String[] args) {File data = new File("data.txt");try {InputStreamReader read = new InputStreamReader(new FileInputStream(data), "UTF-8");final BufferedReader bufferedReader = new BufferedReader(read);for (int i = 0; i < 5; i++) {new Thread(new Runnable() {@public void run() {String lineTXT = null;synchronized (bufferedReader) {try {while ((lineTXT = bufferedReader.readLine()) != null) {System.out.println(Thread.currentThread()+":"+lineTXT);bufferedReader.notify();bufferedReader.wait();}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e) {e.printStackTrace();}finally{bufferedReader.notifyAll();}}}}).start();}} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();}}

⑶ 多线程同时写不同的文件

不会,因为系统会调度所有线程,帮助各个线程排队写入(比如系统发现线程1正在操作磁盘,就让线程2等待一会),写程序时基本不用考虑。

⑷ 多线程同时向一个日志文件写写入信息,c#如何实现

不要让线程写日志,日志文件最好程序启动后就打开,每次需要在打开写入关闭非常消耗资源,建议如下:新建一个类,专门用来写日志,构造的时候即打开或新建日志文件,析构的时候关闭文件,程序启动后就实例化这个类,然后将此类实例传递给线程,这样就没问题了。顺便推荐你log4net,专门用来写日志的一个第三方库,使用了有一段时间了,没发现您遇到的此类问题。

⑸ Java:关于多线程写文件流的问题

不会的 放心 每个线程都各自引用着自己的流 每个流都各自保存着各自的状态 不会混淆的,记得每个线程完的时候关闭流

⑹ MFC多线程写文件出现数据混乱

写文件很快的不太极端追求高实时性,不需要开新线程去写,可能还因为创建新线程还花更多的开销另外多线程执行顺序确实不是可预测的,开了一堆线程,不能保证先开的线程就一定执行在最前,所以数据写入顺序是错的,可以理解你可以把要写的文本添加到类似List<CString>中,往末尾追加,再开线程,线程去看List<CString>中有几个元素,没有就结束线程,有就从头元素开始写入文本文件,写完一个,删除头元素,再判断是否有元素,有就继续写头个元素,写完删,。。。。。。这样就能保证写入顺序了,当然取出元素/删除元素时,要Section.Lock / Unlock我喜欢用两个List<CString>,写的时候,标记下,让添加文本的都添加到另一个列表中,写完后,修改标记,以示切换这两个List,让添加文本的线程都添加到先前写完了的列表,写线程转去写另外一个列表

⑺ 使用threadpool模块多线程写同一个文件的时,需要加锁吗

当然需要加锁,线程池本身是不关心临界问题的。多线程写同一个文件如果不加锁,会出现写入数据交错的情况。任何线程池模型都不会内置临界保护机制,因为不同业务场景下临界保护的方式很多,对性能影响很大,所以需要自己手动去做。

⑻ writefile 多线程写多文件 该如何做

下面的程序,编译之后,你可以运行很多个实例,目前我将文件写在了D:\1.txt,每个程序写1000行数据,这些值你可以自己更改(比如 写在C:,每个程序写10000行等),等程序都写完后,你可以去文件中查看写文件的结果。补充一下,我是在VC6.0环境中写的,所以windows.h,如果你不是在这个环境中的话,可能需要修改一些定义,比如DWORD等。其他的API都是windows平台提供的API;#include <stdio.h>#include "windows.h"int main(){//获取进程ID,因为你希望是多个进程运行同时写一个文件,所以,我们打印出进程IDDWORD dwProcessID = GetCurrentProcessId();//初始化我们要写入文件中的内容,及该内容长度;char szContent[100] = {0};sprintf(szContent,"process[%u] write file\r\n",dwProcessID);DWORD dwContentLen = strlen(szContent);//创建互斥量,这样可以进行进程间的互斥,当然用这个也可以做线程间的互斥HANDLE hMutex = CreateMutex(NULL,FALSE,"MyFileMutex");if (NULL == hMutex){printf("[%u]Create/Open Mutex error!\r\n",dwProcessID);return 1;}//创建或打开文件HANDLE hFile = CreateFile("D:\\1.txt",GENERIC_READ | GENERIC_WRITE,FILE_SHARE_WRITE | FILE_SHARE_READ,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_ARCHIVE,NULL);if (INVALID_HANDLE_VALUE == hFile){printf("[%u]Creat/Open file error!\r\n",dwProcessID);return 1;}//循环写入文件for(int i = 0; i < 1000 ; i++){//等待临界资源,即锁定文件WaitForSingleObject(hMutex,INFINITE);printf("Process[%u] Get the signal\r\n",dwProcessID);DWORD len = 0;//因为是共享写文件,即多个程序写一个文件,所以一定要将文件指针偏移到尾部SetFilePointer(hFile,0,NULL,FILE_END);//写入文件BOOL rnt = WriteFile(hFile,szContent,dwContentLen,&len,NULL);if (rnt == FALSE){printf("Process[%u] Fail to write file\r\n",dwProcessID);}//释放互斥量,解除锁定ReleaseMutex(hMutex);//加个Sleep便于我们中间观察结果Sleep(30);}CloseHandle(hMutex);CloseHandle(hFile);return 0;} 应你要求,我把AIP中的宏定义解释如下:HANDLE hFile = CreateFile("D:\\1.txt",GENERIC_READ | GENERIC_WRITE,//表示程序对该文件有读和写的权限FILE_SHARE_WRITE | FILE_SHARE_READ,//表示可以多个程序共享读和写的权限NULL,OPEN_ALWAYS,//表示打开该文件,如果该文件不存在,则创建该文件FILE_ATTRIBUTE_ARCHIVE,//文件的属性为存档NULL);WaitForSingleObject(hMutex,INFINITE);//INFINITE表示永远等待,直到hMutex有信号为止SetFilePointer(hFile,0,NULL,FILE_END);//FILE_END表示从文件尾部开始偏移;实际此举就是将文件指针偏移到文件尾部;

⑼ windows环境,多线程情况下,C语言向文件写入数据。

下面的程序,编译之后,你可以运行很多个实例,目前我将文件写在了D:\1.txt,每个程序写1000行数据,这些值你可以自己更改(比如 写在C:,每个程序写10000行等),等程序都写完后,你可以去文件中查看写文件的结果。补充一下,我是在VC6.0环境中写的,所以windows.h,如果你不是在这个环境中的话,可能需要修改一些定义,比如DWORD等。其他的API都是windows平台提供的API;#include <stdio.h>#include "windows.h"int main(){ //获取进程ID,因为你希望是多个进程运行同时写一个文件,所以,我们打印出进程ID DWORD dwProcessID = GetCurrentProcessId(); //初始化我们要写入文件中的内容,及该内容长度; char szContent[100] = {0}; sprintf(szContent,"process[%u] write file\r\n",dwProcessID); DWORD dwContentLen = strlen(szContent); //创建互斥量,这样可以进行进程间的互斥,当然用这个也可以做线程间的互斥 HANDLE hMutex = CreateMutex(NULL,FALSE,"MyFileMutex"); if (NULL == hMutex) { printf("[%u]Create/Open Mutex error!\r\n",dwProcessID); return 1; } //创建或打开文件 HANDLE hFile = CreateFile("D:\\1.txt", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_WRITE | FILE_SHARE_READ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_ARCHIVE, NULL); if (INVALID_HANDLE_VALUE == hFile) { printf("[%u]Creat/Open file error!\r\n",dwProcessID); return 1; } //循环写入文件 for(int i = 0; i < 1000 ; i++) { //等待临界资源,即锁定文件 WaitForSingleObject(hMutex,INFINITE); printf("Process[%u] Get the signal\r\n",dwProcessID); DWORD len = 0; //因为是共享写文件,即多个程序写一个文件,所以一定要将文件指针偏移到尾部 SetFilePointer(hFile,0,NULL,FILE_END); //写入文件 BOOL rnt = WriteFile(hFile,szContent,dwContentLen,&len,NULL); if (rnt == FALSE) { printf("Process[%u] Fail to write file\r\n",dwProcessID); } //释放互斥量,解除锁定 ReleaseMutex(hMutex); //加个Sleep便于我们中间观察结果 Sleep(30); } CloseHandle(hMutex); CloseHandle(hFile); return 0;} 应你要求,我把AIP中的宏定义解释如下:HANDLE hFile = CreateFile("D:\\1.txt",GENERIC_READ | GENERIC_WRITE,//表示程序对该文件有读和写的权限FILE_SHARE_WRITE | FILE_SHARE_READ,//表示可以多个程序共享读和写的权限NULL,OPEN_ALWAYS,//表示打开该文件,如果该文件不存在,则创建该文件FILE_ATTRIBUTE_ARCHIVE,//文件的属性为存档NULL);WaitForSingleObject(hMutex,INFINITE);//INFINITE表示永远等待,直到hMutex有信号为止SetFilePointer(hFile,0,NULL,FILE_END);//FILE_END表示从文件尾部开始偏移;实际此举就是将文件指针偏移到文件尾部;

⑽ c语言文件读写 多线程

主线程读的是A文件,次线程写的是B文件,两者不冲突。4K的buffer已经算很小了。重点是主次线程共享的数据需要做同步,所以才造成了要等待的现象。你说的类似消费者和生产者模型。