0

我正在使用 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;
}
4

2 回答 2

3

手动本地时间:

四个函数 asctime()、ctime()、gmtime() 和 localtime() 返回指向静态数据的指针,因此不是线程安全的。线程安全版本 asctime_r()、ctime_r()、gmtime_r() 和 localtime_r() 由 SUSv2 指定,从 libc 5.2.5 开始可用。

于 2013-08-21T03:37:06.733 回答
2

localtime不是线程安全的,来自草案 C99 标准部分7.23.3 时间转换函数说:

除了 strftime 函数,这些函数都返回一个指向以下两种静态对象之一的指针:分解的时间结构或 char 数组。执行返回指向这些对象类型之一的指针的任何函数可能会覆盖任何相同类型的对象中的信息,这些对象由任何先前调用它们中的任何一个返回的值所指向的相同类型的对象。实现的行为就像没有其他库函数调用这些函数一样

localtime属于部分7.23.3.4并属​​于该条件。localtime的手册页也明确指出它不是线程安全的:

四个函数 asctime()、ctime()、gmtime() 和 localtime() 返回指向静态数据的指针,因此不是线程安全的。线程安全版本 asctime_r()、ctime_r()、gmtime_r() 和 localtime_r() 由 SUSv2 指定,从 libc 5.2.5 开始可用

标准中既没有timemktime没有类似的条件。

于 2013-08-21T03:43:02.077 回答