2012-02-04 36 views
7

Hãy xem xét các hàm như localtime trong thư viện chuẩn C để trả về con trỏ tới bộ đệm tĩnh (lịch sử). Có C11 làm cho các bộ đệm thread-local?Chuỗi an toàn C11 đối với các hàm trả về con trỏ tới bộ đệm tĩnh

mỗi 7.1.4 trong C11:

Trừ khi quy định rõ ràng trong các mô tả chi tiết tiếp theo, chức năng thư viện có trách nhiệm ngăn chặn các cuộc đua dữ liệu như sau: Một chức năng thư viện có trách nhiệm không trực tiếp hoặc gián tiếp đối tượng truy cập truy cập bằng chủ đề khác với luồng hiện tại trừ khi các đối tượng được truy cập trực tiếp hoặc gián tiếp thông qua các đối số của hàm. Một hàm thư viện sẽ không trực tiếp hoặc gián tiếp sửa đổi các đối tượng có thể truy cập bởi các luồng khác với luồng hiện tại trừ khi các đối tượng được truy cập trực tiếp hoặc gián tiếp thông qua các đối số không phải của hàm. Việc triển khai có thể chia sẻ các đối tượng nội bộ của riêng chúng giữa các chuỗi nếu đối tượng không hiển thị với người dùng và được bảo vệ khỏi các cuộc đua dữ liệu.

Hãy xem ví dụ localtime. struct tm mà điểm giá trị trả về của nó dường như không đủ điều kiện làm "đối tượng nội bộ" vì nó có thể truy cập được đối với người gọi, vì vậy có vẻ như yêu cầu localtime trong một chuỗi khác có thể không ghi lại kết quả được trả về trước đó trong chuỗi đầu tiên. Điều này có nghĩa là localtime cần phải sử dụng bộ đệm khác nhau cho mỗi luồng.

Tuy nhiên, không có tiêu chuẩn nào xác định kết thúc vòng đời của đối tượng có địa chỉ được trả lại và tôi không thấy lý do nào chương trình tiếp tục sử dụng struct tm sau khi chuỗi kết thúc cuộc gọi sẽ không hợp lệ. Do đó, đối tượng không thể có thời gian lưu trữ luồng.

Cách duy nhất tôi có thể thấy rằng triển khai có thể đáp ứng tất cả các yêu cầu là để bộ nhớ bị rò rỉ khắp nơi, điều này chắc chắn không phải là mục đích. Tôi có thiếu một cái gì đó hiển nhiên, hoặc là C11 của điều trị thread-an toàn đối với các giao diện di sản thực sự này suy nghĩ kém?

Trả lời

8

... unless explicitly stated otherwise: Chương giới thiệu của 7.27.3 Time conversion functions tuyên bố rõ ràng rằng các chức năng này không được phép tránh cuộc đua dữ liệu. (Như trường hợp của nhiều chức năng thư viện khác.)

Có hàm bắt nguồn với _s hậu tố trong phần mở rộng kiểm tra giới hạn trong phụ lục K được thiết kế để tránh điều kiện chủng tộc.

+0

OK, tôi đã xem tài liệu cụ thể cho các chức năng chứ không phải phần giới thiệu. Có vẻ như bạn đã tìm thấy những gì tôi đã bỏ lỡ. –

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