一种多线程无锁高速写文件的方法与流程

文档序号:36317521发布日期:2023-12-08 08:24阅读:32来源:国知局
本发明涉及文件操作及多线程处理,具体涉及一种多线程无锁高速写文件的方法。
背景技术
::1、传统的文件写入方法在多线程环境下通常需要使用锁来保护共享资源,以确保线程安全。然而,使用锁会引入竞争和等待,降低了文件写入的性能。此外,通常写过程中实时创建多个文件句柄以处理多个写操作,也会增加文件写入的延迟。技术实现思路1、本发明为了克服以上技术的不足,提供了一种通过标志位原子操作和多句柄句柄池来实现高速写文件,从而提高了多线程环境下的文件写入效率的方法。2、本发明克服其技术问题所采用的技术方案是:3、一种多线程无锁高速写文件的方法,包括如下步骤:4、a)在代码全局区域定义数据结构体thread_table,初始化数据结构体表tb;5、b)创建读写文件目录并初始化写文件;6、c)超时线程进行初始化及启动;7、d)多个写线程进行写文件操作;8、e)超时线程对写文件进行关闭、移动、新建及标志位更新。9、进一步的,步骤a)包括如下步骤:10、a-1)在代码全局区域定义数据结构体thread_table,数据结构体thread_table用于存储线程的线程编号、写文件句柄、写文件临时句柄、待关闭文件句柄、文件是否有数据标志位、文件是否需要重新创建标志位、文件累加计数标志、待移动的文件名称、下次移动的文件名称;11、a-2)读取自定义的配置文件a,配置文件a用于获取全部写线程编号及写线程数量;12、a-3)新建数据结构体表tb,通过malloc函数为数据结构体表tb创建一块连续内存,该内存中根据配置文件a中获取的写线程数量通过数组的形式存储相应数量的数据结构体thread_table,通过memset函数对数据结构体表tb进行清空动作,将写线程编号通过数组下标法一次赋值给数据结构体表tb中每个数据结构体thread_table的线程编号。13、进一步的,步骤b)包括如下步骤:14、b-1)读取自定义的配置文件b,配置文件b用于获取写文件目录、读文件目录,通过access函数检测写文件目录及读文件目录是否存在,如果存在则执行步骤b-2);15、b-2)通过系统time函数获取当前系统时间,通过for循环遍历数据结构体表tb中的所有数据结构体thread_table,根据每个数据结构体thread_table中的线程编号和文件累加计数标志通过系统snprintf函数拼接写文件名为:当前系统时间-线程编号-文件累加计数标志;16、b-3)根据写文件名在写文件目录中创建写文件,调用系统fopen函数对写文件进行打开动作,得到写文件句柄,将写文件句柄赋值给每个数据结构体thread_table中的写文件句柄,每个数据结构体thread_table的文件累加计数标志加1,通过系统函数memcpy将写文件名赋值给每个数据结构体thread_table的待移动的文件名称;17、b-4)根据步骤b-3)中赋值后的每个数据结构体thread_table中的线程编号和文件累加计数标志通过系统snprintf函数拼接写文件名为:当前系统时间-线程编号-文件累加计数标志;18、b-5)根据步骤b-4)中写文件名在写文件目录中创建写文件,调用系统fopen函数对写文件进行打开动作,得到写文件句柄,将写文件句柄赋值给每个数据结构体thread_table中的写文件句柄,每个数据结构体thread_table的文件累加计数标志加1,通过系统函数memcpy将写文件名赋值给每个数据结构体thread_table的下次移动的文件名称。19、进一步的,步骤b-1)中如果写文件目录及读文件目录不存在则通过系统函数mkdir创建写文件目录及读文件目录。20、进一步的,步骤c)包括如下步骤:21、c-1)读取自定义的配置文件c,配置文件c用于获取写文件超时时间及超时线程的运行cpu编号;22、c-2)基于配置文件c中的超时时间定义定时器timer及定义超线程超时后回调函数timer_cb;23、c-3)调用函数timer_reset,将定时器timer、超线程超时后回调函数timer_cb、超时线程的运行cpu编号作为参数传递给函数timer_reset进行初始化操作;24、c-4)通过dpdk中mainloop方式启动超时线程,该超时线程运行在指定的cpu编号上,定时器timer超时后,调用超线程超时后回调函数timer_cb。25、进一步的,步骤d)包括如下步骤:26、d-1)在写线程写入数据前基于写线程各自线程号,通过下标法找到步骤a-3)中数据结构体表tb对应的数据结构体thread_table,通过成员访问的方式得到数据结构体thread_table中存储的写文件句柄;27、d-2)如果数据结构体thread_table中存储的写文件句柄为null,则返回执行步骤d-1),如果数据结构体thread_table中存储的写文件句柄不为null,则调用系统函数fwrite,将写文件的数据写入步骤d-1)中的写文件句柄中;28、d-3)各写线程重复步骤d-1)只步骤d-2),持续写文件操作。29、还包括在步骤d-2)后将数据结构体thread_table中存储的文件是否有数据标志位置为1。30、进一步的,步骤e)包括如下步骤:31、e-1)定时器timer超时后,调用超线程超时后回调函数timer_cb,超线程超时后回调函数timer_cb通过for循环遍历数据结构体表tb中所有数据结构体thread_table;32、e-2)查看数据结构体thread_table的待关闭文件句柄是否有值,如果待关闭文件句柄为null,则执行步骤e-4),如果待关闭文件句柄不为null,则执行步骤e-3);33、e-3)调用系统函数fclose关闭数据结构体thread_table的待关闭文件句柄,将该关闭的待关闭文件句柄设置为null,调用系统函数snprintf拼接写文件目录及数据结构体thread_table的待移动的文件名称,调用系统函数snprintf拼接读文件目录及数据结构体thread_table的待移动的文件名称,调用系统函数rename,将写文件拷贝至读文件目录中;34、e-4)查看每一个数据结构体thread_table中的文件是否需要重新创建标志位置为1,如果否则执行步骤e-6),如果是则执行步骤e-5);35、e-5)调用系统函数memset清空数据结构体thread_table中存储的下次移动的文件名称,通过系统函数snprintf拼接写文件名为:当前系统时间-线程编号-文件累加计数标志,根据得到的写文件名在步骤b-1)中写文件目录中创建写文件,调用系统fopen函数对写文件进行打开动作,得到写文件句柄,将写文件句柄赋值给数据结构体thread_table中的写文件句柄,数据结构体thread_table的文件累加计数标志加1,通过系统函数memcpy将写文件名赋值给数据结构体thread_table的下次移动的文件名称,将数据结构体thread_table中的文件是否需要重新创建标志位置为0;36、e-6)查看每一个数据结构体thread_table中的文件是否有数据标志位是否为1,如果为1,则执行步骤e-7);37、e-7)将数据结构体thread_table的写文件句柄幅值给待关闭文件句柄,将数据结构体thread_table的写文件临时句柄幅值给写文件句柄,将数据结构体thread_table的文件是否有数据标志位置0,将数据结构体thread_table的文件是否需要重新创建标志位置1。38、进一步的,还包括在步骤e-7)后判断步骤e-1)中for循环是否结束,如果未结束则继续执行步骤e-2),如果结束则重复执行步骤e-1)。39、本发明的有益效果是:40、通过采用多线程无锁高速写文件的方法,极大地提升了文件写入性能和效率。传统的文件写入方式常常受限于锁机制,多线程环境下容易出现竞争和等待,导致性能下降和延迟增加。而本发明的方法通过多线程并发,每个线程独立进行文件写入,充分利用系统资源,避免了线程等待,从而显著提高了写入性能。41、此外,本发明还采用了无锁机制,消除了线程之间的竞争,减少了系统开销,进一步提高了效率。这种机制尤其在高负载情况下表现出色,确保了文件写入的稳定性和可靠性。42、通过预分配文件句柄和文件名,本发明加速了文件的创建和管理过程,避免了频繁的文件操作,降低了系统开销。同时,超时线程和定时器机制保证了文件的及时关闭和移动,提高了实时性,降低了数据丢失的风险。43、本发明的设计简单清晰,易于实现和维护,适用于各种应用场景。它不仅提高了系统整体性能,还有助于降低资源浪费,从而为数据存储、日志记录、实时数据处理等领域的应用提供了强大的支持,提升了系统的实时性和吞吐量,为多线程高性能文件写入问题提供了一种可行的解决方案。当前第1页12当前第1页12
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1