1. 程式人生 > >localtime_r在多執行緒環境下可能存在死鎖

localtime_r在多執行緒環境下可能存在死鎖

         但是在某些情況下,localtime_r可能存在死鎖的情況,使用如下的測試程式:

       #include <pthread.h>
#include <time.h>

       void *mytest(void *arg)
{
        pthread_detach(pthread_self());

               time_t current;
        struct tm date;
        time(&current);

               while (1) {
                localtime_r(&current, &date);
                printf("OK/n");
        }
}

       int main()
{
        int i = 0;
        pthread_t tid[10];

               for (i = 0; i < 10; i++) {
                pthread_create(&tid[i], NULL, mytest, NULL);
        }

               sleep(1);

               pthread_cancel(tid[0]);
        pthread_cancel(tid[1]);
        pthread_cancel(tid[2]);
        pthread_cancel(tid[3]);

                while (1)
                sleep(100000000);
}

         執行該測試程式, 大約1秒之後, 螢幕不再輸出任何資訊,使用dbx跟蹤程式如下:
(dbx) thread
 thread  state-k     wchan            state-u    k-tid mode held scope function
 $t1     wait      0xf100060027c244b0 running  7172309   k   no   sys  nsleep           
*$t2     run                          blocked  7176385   k   no   sys  _global_lock_common
 $t3     wait      0x000000011000ad18 blocked  3379347   k   no   sys  _rec_mutex_lock  
 $t4     zomb                         terminated 7180483   k   no   sys  pthread_exit     
 $t5     wait      0x000000011000ad18 blocked  9109677   k   no   sys  _rec_mutex_lock  
>$t6     wait      0x000000011000ad18 blocked  3498171   k   no   sys  _rec_mutex_lock  
 $t7     wait      0x000000011000ad18 blocked  3502269   k   no   sys  _rec_mutex_lock  
 $t8     wait      0x000000011000ad18 blocked  3506367   k   no   sys  _rec_mutex_lock  
 $t9     wait      0x000000011000ad18 blocked  2384027   k   no   sys  _rec_mutex_lock  
 $t10    wait      0x000000011000ad18 blocked  2932903   k   no   sys  _rec_mutex_lock  
 $t11    wait      0x000000011000ad18 blocked  2494699   k   no   sys  _rec_mutex_lock  
(dbx) where
_rec_mutex_lock(??) at 0x900000000028f90
localtime_tz_r(??, ??, ??) at 0x900000000055644
mytest(0x0) at 0x1000005fc

所有的執行緒都在試圖獲取鎖,程序處於死鎖狀態。目前AIX工程師給出的臨時解決方案是將環境變數TZ設定為BEIST,
export TZ=BEIST
之後再執行測試程式就沒有死鎖的現象。由於TZ是一個系統環境變數,修改之後可能會引起其他系統出問題.