1

在模拟程序中,我试图将测量值打印到文本文件中。该项目是 Java、C 和 C++ 的组合,但我正在使用的文件是 C 语言。打印代码如下:

if(sample)
  fprintf(MeasureInfo->measuresFile, "%d: %f\n", count++, sample);

这适用于部分输出,但有大量数据(大约 100 到 1000 个度量)未打印到文本文件中。相反,我在 Sublime Text 中只看到大量 NUL,在 bless 中看到 0 字节:

436: 0.851661
437: 0.043466
(Really large block of NUL all in one line).210402
751: 0.357543
752: 0.816120

到目前为止,我只使用了部分代码,并认为这可能是一个并发问题。因此,我打印出所有使用 getpid() 访问该函数的 pid,它给了我不同的 pid(例如 19036、19037、19038)。然后我尝试使用 pthread_mutex_lock 和 pthread_mutex_unlock 但它产生了相同的输出。我尝试的另一件事是每 400 次测量后使用睡眠。这实际上有助于但将产生的小节数量减少了四分之一。

您知道实际问题可能是什么以及如何解决吗?如果这是一个已回答或简单的问题,我真的很抱歉,但我尝试并搜索了一段时间并没有找到解决方案。

4

2 回答 2

0

sample看起来是浮点数或双精度数。您不应该将浮点变量与固定值进行比较,因为它很可能永远不会有这个值。对于浮点变量,您应该始终与增量进行比较。您的if子句可能总是会被输入。

fprintf虽然不应该打印 NUL 。你能显示确切的输出(或部分输出)吗?

于 2013-06-15T13:03:29.817 回答
0

I/O 和多任务处理是危险的组合。在线程级别,fprintf以线程不安全的方式写入缓冲区。单独的格式化组件可能会相互覆盖,当一个调用刷新缓冲区而另一个尝试写入时,结果肯定会丢失数据。它甚至可能导致缓冲区溢出并在stdio库内部崩溃。

在进程级别,缓冲区被刷新到文件中的特定位置。如果两个进程尝试同时写入,它们将破坏彼此的结果。进程通常不会轮询文件系统以检查文件是否由于外部影响而增长,然后在写入之前寻找新的结束。

如果您有一个非常大的项目并且无法将所有 I/O 同步到该文件,请考虑分配每个线程或处理其自己的文件,并在事后合并文件。

于 2013-06-15T14:11:03.967 回答