2011-06-20 34 views
10

errno trên MSVC thread-safe?MSVC errno an toàn chủ đề

Theo câu trả lời trong this question POSIX yêu cầu rằng errno là an toàn chỉ. Nhưng MSVC có lẽ không tuân thủ POSIX và MSDN không nói bất cứ điều gì về an toàn luồng. MSDN mâu thuẫn nói rằng errno được khai báo là extern int errno;, mà còn là #define errno (*_errno())

+0

Bạn đang sử dụng phiên bản Visual C++ nào? –

+0

@Steve: Hiện nay chủ yếu là MSVC 2010. –

Trả lời

13

Mặc dù MSVC là chắc chắn không phải POSIX tuân thủ, errno được thực hiện trong thời gian chạy MSVC (ít nhất là của MSVC2008) một cách threadsafe.

Mặc dù tài liệu tuyên bố rằng nó là extern int errno nó thực sự được triển khai dưới dạng #define cho một chức năng cho phép áp dụng an toàn luồng. Nếu bạn bước qua chức năng này trong cửa sổ tháo gỡ, rõ ràng là lưu trữ cục bộ luồng được sử dụng.

Đáng buồn là tôi không thể trỏ đến bất kỳ tài liệu chính thức nào xác nhận điều này nhưng đó là cuộc sống!

2

Tôi không thể tìm thấy bất kỳ đâu trên trang MSDN nơi thảo luận này. Tuy nhiên, nhiều hàm trả về các bộ đệm tĩnh đã là chủ đề an toàn trong MSVC (nghĩa là chúng trả về các con trỏ tới các bộ đệm cục bộ luồng). Vì vậy, nó sẽ là đáng ngạc nhiên nếu errno không phải là chủ đề an toàn.

Các MSVC tiêu đề tập tin đều có định nghĩa này:

#ifndef _CRT_ERRNO_DEFINED 
#define _CRT_ERRNO_DEFINED 
_CRTIMP extern int * __cdecl _errno(void); 
#define errno (*_errno()) 

errno_t __cdecl _set_errno(_In_ int _Value); 
errno_t __cdecl _get_errno(_Out_ int * _Value); 
#endif /* _CRT_ERRNO_DEFINED */ 

Và một chương trình thử nghiệm nhỏ showd rằng 2 đề thiết errno đã ít nhất là không ảnh hưởng đến eachother. Vì vậy, tôi muốn nói rằng nó an toàn để giả định errno là thread an toàn (mặc dù có thể không nếu bạn liên kết đến một chuỗi CRT)

+0

Tôi không nghĩ rằng họ làm một CRT chuỗi đơn lẻ những ngày này. –

+0

Không phải vì VS2005 đã có sẵn - xem http://msdn.microsoft.com/en-us/library/abx4dbyh(v=vs.80).aspx –