我正在使用Linux(使用libc-2.12.so的CentOS 6.3发行版)。
我想知道C库函数time()
,localtime()
,mktime()
是否可以在多线程环境下使用。
仅举例(不一定是我的项目代码):
#include <stdio.h>
#include <time.h>
int main()
{
time_t timep;
struct tm *p;
for (int i = 0; i < 1000; ++i)
{
time(&timep);
printf("time() : %d \n", timep);
p = localtime(&timep);
timep = mktime(p);
printf("time()->localtime()->mktime():%d\n", timep);
}
return 0;
}
如果我用OpenMP包装上面的代码怎么办?那就是把它放在多线程环境下。
#include <stdio.h>
#include <time.h>
#include <omp.h>
int main()
{
time_t timep;
struct tm *p;
#pragma omp parallel for
for (int i = 0; i < 1000; ++i)
{
time(&timep);
printf("time() : %d \n", timep);
p = localtime(&timep);
timep = mktime(p);
printf("time()->localtime()->mktime():%d\n", timep);
}
return 0;
}
答案 0 :(得分:2)
四个函数asctime(),ctime(),gmtime()和localtime()返回一个指向静态数据的指针,因此不是线程安全的。线程安全版本asctime_r(),ctime_r(),gmtime_r()和localtime_r()由SUSv2指定,并且自libc 5.2.5起可用。
答案 1 :(得分:1)
localtime
不是线程安全的,来自draft C99 standard部分7.23.3
时间转换功能说:
除了strftime函数之外,这些函数都返回指向两个函数之一的指针 静态对象的类型:分解的时间结构或char数组。执行 返回指向这些对象类型之一的指针的任何函数都可能会覆盖 从any返回的值指向的任何相同类型的对象中的信息 之前的任何一个电话。该实现应该表现得好像没有其他库 函数调用这些函数。
localtime
属于7.23.3.4
部分,属于该条件。 man page for localtime也清楚地表明它不是线程安全的:
asctime(),ctime(),gmtime()和localtime()这四个函数返回一个指向静态数据的指针,因此不是线程安全的。线程安全版本asctime_r(),ctime_r(),gmtime_r()和localtime_r()由SUSv2指定,并且自libc 5.2.5起可用
标准中time
和mktime
都没有类似条件。