Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在实时Linux应用程序中记录数据?_Linux_Multithreading_Asynchronous_Sqlite_Real Time - Fatal编程技术网

如何在实时Linux应用程序中记录数据?

如何在实时Linux应用程序中记录数据?,linux,multithreading,asynchronous,sqlite,real-time,Linux,Multithreading,Asynchronous,Sqlite,Real Time,我正在使用4.4.12-rt19 RTLinux内核补丁 我有一个用C编写的实时应用程序,它在不同的内核上运行不同的进程,从网络中获取数据,计算数据,然后记录结果。我正试图以每毫秒10KB的数据量登录文件 日志进程可以访问共享内存中的所有传入数据。现在,我正在使用sqlite3和sqlite3async将数据库缓冲到日志进程的一个线程中的内存中,然后通过调用sqlite3async_run()每秒将内存中的实例提交到文件中 问题在于,在执行sqlite3async_run()的部分过程中,写入内

我正在使用4.4.12-rt19 RTLinux内核补丁

我有一个用C编写的实时应用程序,它在不同的内核上运行不同的进程,从网络中获取数据,计算数据,然后记录结果。我正试图以每毫秒10KB的数据量登录文件

日志进程可以访问共享内存中的所有传入数据。现在,我正在使用sqlite3和sqlite3async将数据库缓冲到日志进程的一个线程中的内存中,然后通过调用sqlite3async_run()每秒将内存中的实例提交到文件中

问题在于,在执行sqlite3async_run()的部分过程中,写入内存数据库缓冲区的sqlite3_step()命令挂起,并违反了我的1ms计时保证

我不确定发生错误是因为线程化进程在实时环境中的工作方式,还是因为sqlite3async的工作方式。据我所知,sqlite3async应该能够使用sqlite3虚拟文件系统在内存中缓冲数据库,然后使用后台线程处理实际的文件写入(如详细所述)。我尝试过改变每个线程的调度优先级和精细度,但没有效果


任何帮助或建议都将不胜感激

使用
sqlite3async
不会消除与写入相关的延迟;它只是把它们推迟到你能负担得起的时候

考虑使用WAL模式。在这里,在执行时有相同的延迟,但WAL存储在磁盘上,因此可以将检查点延迟任意长时间,而不会耗尽内存(代价是WAL变得任意大)


如果在WAL模式下写入速度仍然太慢,您必须实现自己的FIFO,并让另一个线程不断清空它。(如果该线程在实际写入之前将数据移出FIFO,FIFO将不会长时间锁定。)

WAL模式似乎太慢,因此我将日志模式设置为足够快的内存。我的应用程序很好,没有日志在每次提交时写入文件。谢谢你的帮助!