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?
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ỡ. –