我想将时间打印到输出文件。我使用以下代码来执行此操作:
time_t currentTime;
struct tm *localTime;
time( ¤tTime ); // Get the current time
localTime = localtime( ¤tTime ); // 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\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\00\
该文件认为它是二进制文件,而不是.txt文件。一些较高的核心数可以正确打印我究竟做错了什么?无论代码运行多少核心,如何才能正确打印出来?
答案 0 :(得分:1)
您的问题可能源于localtime()
函数不是线程安全的事实。它返回一个指向静态缓冲区的指针,如果其他源调用localtime()
,它可能会被损坏。
有一个名为localtime_r()
的localtime()
的线程安全实现,在某些系统上可用。如果这不是一个选项,您需要确保在任何给定点只有一个线程正在调用或使用localtime()
的结果。
答案 1 :(得分:0)
即使只有1个核心正在写入输出文件,我每个核心都打开了输出文件。当我只有写入输出文件的MPI等级打开它时,问题似乎就消失了。