将 time() 打印到文件会导致二进制字符

Printing time() to a file results in binary characters

我想将时间打印到输出文件中。我正在使用以下代码来做到这一点:

time_t currentTime;
struct tm *localTime;

time( &currentTime );                   // Get the current time
localTime = localtime( &currentTime );  // Convert the current time to the local time
int Day    = localTime->tm_mday;
int Month  = localTime->tm_mon + 1;
int Year   = localTime->tm_year + 1900;
int Hour   = localTime->tm_hour;
int Min    = localTime->tm_min;
int Sec    = localTime->tm_sec;

output << "SimpleLD run at " << Day << "/" << Month << "/" << Year << " " << Hour << ":" << Min << ":" << Sec << std::endl;

其中output为输出文件。我是 运行 多个处理器上的代码,但只有 0 级处理器写入文件。对于某些运行(4、8、16 核),这可以正常工作。但对于其他人(32、64 核),这会导致输出文件打印:

00[=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=][=11=]\

并且文件认为它是二进制文件,而不是 .txt 文件。一些较高的核心数可以正确打印。我究竟做错了什么?无论代码 运行 在多少个内核上,我如何获得正确打印的时间?

您的问题可能源于 localtime() 函数 不是 线程安全的。它 returns 一个指向静态缓冲区的指针,如果其他来源调用 localtime().

,该缓冲区可能会损坏

有一个名为 localtime_r()localtime() 的线程安全实现,它在某些系统上可用。如果这不是一个选项,您需要确保在任何给定点只有一个线程正在调用或使用 localtime() 的结果。

我让每个内核都打开了输出文件,即使只有 1 个内核正在写入它。当我只有写入输出文件的 MPI 等级打开它时,问题似乎消失了。