时间相关的功能和多个线程

时间:2013-08-21 03:26:30

标签: c linux multithreading time

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

2 个答案:

答案 0 :(得分:2)

来自manual localtime

  

四个函数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起可用

标准中timemktime都没有类似条件。