2013-08-21 30 views
7

Các trang người đàn ông của mktime không đề cập đến chủ đề an toàn của mktime, nhưng nó đã đề cập này mà làm cho nó trông giống như chủ đề không an toàn:Chuẩn C mktime thread có an toàn trên Linux không?

Calling mktime() cũng đặt biến tzname bên ngoài với thông tin về múi giờ hiện tại.

Tôi biết trên Linux mktime gọi tzset thiết tzname, mà là một char * []:

extern char * tzname [2];

và tzset sẽ đọc biến môi trường TZ và tệp/etc/localtime. Vì vậy, trừ khi mktime sử dụng một mutex để bảo vệ tất cả các hoạt động này, tôi không thể thấy làm thế nào nó có thể được thread an toàn.

+0

có thể trùng lặp của [chức năng thời gian C nhiều chủ đề] (http://stackoverflow.com/questions/18348383/c-time-function-multiple-thread) –

+0

@ShafikYaghmour Câu hỏi trước và câu trả lời của nó tập trung vào 'asctime' , 'ctime',' gmtime' và 'localtime' trả về con trỏ cho dữ liệu tĩnh và do đó thiết kế không an toàn theo luồng. Câu hỏi này đặc biệt về 'mktime' có giao diện không phải là luồng không an toàn, nhưng tác dụng phụ được bổ sung bởi POSIX có thể là. Vì vậy, đây không phải là một bản sao của câu hỏi trước đó. – user4815162342

+0

đúng vậy, tôi nghĩ rằng hai dòng đầu tiên được thêm vào là một chút sai lầm, câu hỏi trước đó không trả lời bất cứ điều gì liên quan đến mktime. – swang

Trả lời

8

Đúng là mktime có tác dụng phụ, nhưng tác dụng phụ sẽ vô hại trong hầu hết các chương trình.

Theo POSIX, các tác dụng phụ sẽ như thể tzset đã được gọi là, do đó chỉ đơn thuần là sao chép thông tin múi giờ từ biến TZ môi trường đến tzname mảng các chuỗi C. Nếu đơn đăng ký của bạn không thay đổi TZ, bạn sẽ không gặp vấn đề gì với việc gọi số mktime() đồng thời.

Ngoài việc này, tzsetdoes use a mutex của GNU libc để bảo vệ tính toàn vẹn của tzname. Đây là một bổ sung chất lượng thực hiện không được đảm bảo theo tiêu chuẩn.

+0

tốt, nhưng có vẻ TZ có thể được thay đổi bởi nhiều hàm thời gian khác, ví dụ: strftime, hoặc bằng cách gọi trực tiếp tzset. Ngoài ra TZ thường trỏ đến một tập tin được symlinked từ/etc/localtime, có thể được thay đổi bất cứ lúc nào là tốt? – swang

+0

Xin lỗi vì không thấy chỉnh sửa của bạn, điều này có ý nghĩa hơn, toàn bộ cuộc gọi tzset được bảo vệ bởi một mutex, vì vậy bất kỳ chức năng thời gian nào sử dụng thông tin múi giờ sẽ được đồng bộ hóa ở mutex, bao gồm cả strptime và strftime. Điều này đảm bảo an toàn luồng, nhưng âm thanh rất kém hiệu quả đối với tôi. – swang

+0

@swang 'tzset' có [đường dẫn nhanh] (http://sourceware.org/git/?p=glibc.git;a=blame;f=time/tzset.c; hb = 26b4d7667169f8db26fd8194b3c498ec58e50f90 # l173) sẽ thoát ra nếu giá trị của biến môi trường 'TZ' không thay đổi, thay đổi thành'/etc/localtime' mặc dù vậy. Do đó hiệu quả của nó nên hợp lý. – user4815162342

Các vấn đề liên quan