localtime_r在多執行緒環境下可能存在死鎖
阿新 • • 發佈:2019-01-30
但是在某些情況下,localtime_r可能存在死鎖的情況,使用如下的測試程式:
(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是一個系統環境變數,修改之後可能會引起其他系統出問題.
#include <pthread.h>
#include <time.h>
void *mytest(void *arg)
{
pthread_detach(pthread_self());
time_t current;
struct tm date;
time(¤t);
while (1) {
localtime_r(¤t, &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);
}
(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是一個系統環境變數,修改之後可能會引起其他系統出問題.