2011-01-17 14 views

Trả lời

13

NSObject cũng như phân bổ đối tượng và giữ lại các chức năng đếm là an toàn chỉ - xem Appendix A: Thread Safety Summary trong Thread Programming Guide.


Sửa: Tôi đã quyết định đi xem một phần mã nguồn mở của Core Foundation. Trong CFRuntime.c, __CFDoExternRefOperation() là chức năng chịu trách nhiệm cập nhật các bộ đếm giữ lại. Nó kiểm tra xem quá trình có nhiều hơn một luồng hay không và nếu có nhiều hơn một luồng, nó sẽ thu được khóa quay trước khi cập nhật số lượng giữ lại, do đó làm cho chuỗi hoạt động này an toàn.

Điều thú vị là số lượng giữ lại không phải là thuộc tính (hoặc biến mẫu) của đối tượng theo nghĩa là struct (lớp). Thời gian chạy giữ một cấu trúc riêng biệt với các quầy lưu giữ. Trong thực tế, nếu tôi hiểu nó một cách chính xác, cấu trúc này là một mảng các bảng băm và có một khóa xoay cho mỗi bảng băm. Điều này có nghĩa là một khóa đề cập đến nhiều đối tượng đã được đặt trong cùng một bảng băm, tức là, khóa không phải là toàn cầu (cho tất cả các trường hợp) cũng không phải cho mỗi trường hợp.

+7

Đúng vậy. Nó sử dụng một chiến lược được gọi là "khóa dải" để giảm ganh đua trên khóa giữ lại toàn cầu. Điều này vẫn còn khá chậm, do đó, nếu bạn có một đối tượng với sự khuấy động số lượng rất lớn, nó có thể đáng giá để thực hiện một hệ thống đếm ngược tùy chỉnh. Nó không phải là đặc biệt khó khăn (sử dụng OSAtomicIncrement() và bạn bè), nhưng bạn sẽ mất khả năng kiểm tra lịch sử refcount trong Instruments cho những đối tượng đó. –