mur*_*ost 3 c time shared-libraries
我正在研究 C 时间库的例程,因为我需要一种方法来跟踪程序日志文件的时间。我发现做到这一点的方法是拥有一个time_t对象,它只保存自 1970 年 1 月 1 日 00:00 UTC 以来的秒数。然后,我将此time_t对象解析为localtime(time_t* argument)例程,该例程将返回指向结构的指针tm。后者将以更复杂的结构保存时间,以秒为单位转换自 1970 年 1 月 1 日以来的年、月、日、小时等时间。该tm结构指针最终可用于asctime(strcut tm* argument)返回人类友好的时间日志(即 2016 年 9 月 7 日星期三 13:45:23)。
我的问题是关于struct tm对象的。正如我们在Cplusplus的示例代码中看到的,struct tm从未声明对象,而只是声明一个指针。这意味着这个对象是在其他地方声明的,而我们只是访问它。参考链接本身指出:
"The function also accesses and modifies a shared internal object,
which may introduce data races on concurrent calls to gmtime and
localtime. Some libraries provide an alternative function that avoids
this data race: localtime_r (non-portable)."
Run Code Online (Sandbox Code Playgroud)
那么,谁创建了该struct tm对象?是第一次加载的C时间库吗?这意味着加载库的第一个进程将声明该对象,而所有其他进程只会与已声明的对象共享该库?struct tm为了避免这些数据争用问题,为每个调用创建一个新对象并返回指向它的指针,以便每个程序都有自己的结构,这不是更好吗?
也许struct tm MyProgramStruct; localtime(&Rawtime, &MyProgramStruct);每个使用 Ctime 的程序都有一个结构而不是单个结构?有什么理由这样做呢?
最后,使用 C 时间库localtime例程是否是一种不好的做法,因为程序不同步可能导致错误的输出?
链接中的示例代码:
/* localtime example */
#include <stdio.h> /* puts, printf */
#include <time.h> /* time_t, struct tm, time, localtime */
int main ()
{
time_t rawtime;
struct tm * timeinfo;
time (&rawtime);
timeinfo = localtime (&rawtime);
printf ("Current local time and date: %s", asctime(timeinfo));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
那么,谁创建了 struct tm 对象?是第一次加载的C时间库吗?
根据该localtime()函数的文档,它返回一个指向静态分配结构的指针。该结构属于 C 库;该函数提供了一个指向它的指针。它所在的确切位置以及存储的确切时间和方式分配的详细信息并不重要,并且可能因实现而异。您只需了解同一进程的不同调用可以使用同一结构并提供指向同一结构的指针。
这意味着加载库的第一个进程将声明该对象,而所有其他进程只会与已声明的对象共享该库?
不需要。您不需要担心进程之间共享的结构,只需担心它在多个调用之间以及同一进程中的多个线程之间共享。
为了避免这些数据争用问题,为每个调用创建一个新的 struct tm 对象并返回指向它的指针,以便每个程序都有自己的结构,这不是更好吗?也许
struct tm MyProgramStruct; localtime(&Rawtime, &MyProgramStruct);每个使用 Ctime 的程序都有一个结构而不是单个结构?有什么理由这样做呢?
再说一遍,这不是跨进程问题,只是进程内问题,这仍然很糟糕。是的,这个问题可以通过不共享结构来解决,这就是 function 的区别localtime_r()(在哪里可用)。但是现有的函数不能更改为执行相同的操作,因为这会给用户带来释放所提供的结构的新要求。
设计者localtime()希望使其易于使用,事实上确实如此,只要您不遇到共享数据问题即可。如果您的程序是单线程的,那么您可以很容易地避免它。 localtime()并不是唯一存在此类问题的标准库函数。
最后,使用 C 时间库
localtime例程是否是一种不好的做法,因为程序不同步可能导致错误的输出?
不是因为这个原因,不是,因为不存在跨进程问题。在使用和其他具有类似静态存储功能的函数时,例如. 但您可以逐个程序判断是否存在数据竞争——您无需担心来自未指定的其他程序的干扰。localtime()strtok()
| 归档时间: |
|
| 查看次数: |
613 次 |
| 最近记录: |