2013-08-21 25 views
0

我正在使用Linux(CentOS 6.3分發與libc-2.12.so)。與時間相關的函數和多線程

不知是否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

「/ n」不*與* \ *相同。 – Casey

回答

1

localtime不是線程安全的,從draft C99 standard部分7.23.3時間轉換功能說:

除strftime函數,這些函數返回一個指向兩個 類型的靜態之一對象:分解的時間結構或char數組。執行 這些對象類型返回指向之一的指針的任何函數都可能會覆蓋以前調用任何對象時返回的值所指向的同一類型的任何對象中的信息 。該實現應該表現得好像沒有其他庫函數調用這些函數

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重視他們的標準相似的條件。

2

manual localtime

的四個功能asctime(),的ctime(),gmtime的()和localtime()返回一個指針到靜態數據,因此不線程安全的。線程安全版本asctime_r(),ctime_r(),gmtime_r()和localtime_r()由SUSv2指定,自從libc 5.2.5開始可用。