2013-08-06 25 views
6

Tôi đang gặp một số sự cố với kết quả sai từ pthread_getspecific trong thư viện được thiết kế để liên kết với nhiều ứng dụng iOS khác nhau.Cách lưu trữ bộ nhớ cục bộ mạnh mẽ trong iOS

Tôi thấy rằng Apple writes:

Cocoa và POSIX lưu trữ các từ điển chủ đề theo những cách khác nhau, vì vậy bạn không thể trộn và kết hợp các cuộc gọi đến hai công nghệ. Miễn là bạn gắn bó với một công nghệ bên trong mã chuỗi của bạn, tuy nhiên, kết quả cuối cùng phải giống nhau. Trong Cocoa, bạn sử dụng phương thức threadDictionary của một đối tượng NSThread để truy xuất một đối tượng NSMutableDictionary, mà bạn có thể thêm bất kỳ khoá nào được yêu cầu bởi luồng của bạn. Trong POSIX, bạn sử dụng các hàm pthread_setspecific và pthread_getspecific để thiết lập và nhận các khóa và giá trị của chuỗi của bạn.

Điều đó có nghĩa rằng không chức năng Cocoa cũng không POSIX TLS có thể được dự kiến ​​làm việc trong mã thư viện khi chúng ta không biết liệu mã mà kêu gọi chúng ta đã sử dụng một hay khác?

Làm cách nào để có thể lưu trữ và truy xuất con trỏ địa phương chủ yếu trong những trường hợp này?

Có hỗ trợ API TLS gốc Darwin, chúng tôi nên sử dụng thay cho Cocoa hoặc POSIX không?

+0

** Đã giải quyết **: Các triệu chứng ban đầu khiến tôi nghi ngờ sự cố pthread_getspecific hóa ra là do các con trỏ lơ lửng để lại bởi một điều kiện chủng tộc không liên quan ở nơi khác trong chương trình. –

Trả lời

6

Tôi tin rằng điểm mà tài liệu của Apple đang tạo ra là bạn không thể sử dụng pthread_setspecific để đặt giá trị và sau đó mong đợi nó có sẵn trong threadDictionary. Tôi không mong đợi họ trực tiếp can thiệp vào nhau; chúng chỉ riêng biệt.

Điều đó nói rằng, nếu đây là mã dành riêng cho iOS, thì the strongly preferred way để quản lý điều này là với GCD chứ không phải chủ đề POSIX. GCD cung cấp tương đương TLS dưới dạng dispatch_get_specific, dispatch_queue_get_specificdispatch_queue_set_specific. Nhưng nó cũng cung cấp quản lý luồng tốt hơn nhiều so với các chủ đề POSIX.

+0

Sự can thiệp sẽ là một lời giải thích thú vị cho các sự cố mà chúng ta đang thấy, mặc dù ... Đây là lớp keo dành riêng cho iOS cho mã hiện có muốn thấy sự trừu tượng chung cho tất cả các nền tảng mà nó chạy trên đó. Bắt vào một nhà cung cấp khóa-in mà muốn chiếm đoạt vai trò hoặc hiện tại của chúng tôi làm việc tốt khái niệm concurrency không phải là một lựa chọn. –

+0

(Không có sự can thiệp sau khi tất cả, chỉ là một snafu đồng thời ở nơi khác trong chương trình mà gây ra một số con trỏ để dangle). –

1

Nếu bạn không ngại sử dụng C++, tăng có thread_specific_ptr. Nó hỗ trợ iOS. Nếu bạn không muốn sử dụng C++, việc triển khai có thể cung cấp một số gợi ý về cách làm cho nó hoạt động mà không có nhiều phụ thuộc bên ngoài.

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