2012-01-25 38 views
7

Tôi gặp một số khó khăn trong việc tìm ra cách pthread_key_t và pthread_key_create hoạt động. Từ hiểu của tôi, mỗi luồng có TLS (lưu trữ cục bộ luồng) và một khóa được sử dụng để truy cập lưu trữ cục bộ luồng. Những gì tôi không nhận được là khi một chìa khóa được tạo ra, mỗi thread có được sử dụng nó? Cho phép nói Thread 0 tạo khóa 0, có thể Thread 1 sau đó sử dụng khóa 0? Nếu Thread 1 sử dụng khóa 0, nó có truy cập TLS của riêng nó hoặc TLS của Thread 0 không?Pthread_key_t và phương thức pthread_key_create hoạt động như thế nào?

Có một số mảng toàn cầu hoặc thứ gì đó theo dõi tất cả các khóa đang được sử dụng không?

Trả lời

5

pthread_keys chỉ là những gì bạn đã nói, lưu trữ cục bộ luồng được giới thiệu bằng một khóa chung. Vì vậy, nhiều chủ đề sử dụng cùng một khóa, nhưng có được không gian lưu trữ khác nhau (cho mỗi chủ đề).

Ví dụ nhanh (cũng được giả mạo), giả sử bạn đang xây dựng một máy chủ không đồng bộ (như IMAP). Bạn có thể theo dõi các kết nối máy khách trong một mảng, với mỗi khóa có một khóa cho nhiệm vụ/yêu cầu hiện tại. Vì vậy, khi một yêu cầu đến trong một chủ đề mới được tách ra và chuỗi lưu trữ trong khóa Client_Connection-> WhatAmIDoing trỏ đến cấu trúc "yêu cầu". Các chủ đề bây giờ sẽ không phải vượt qua xung quanh con trỏ đó bởi vì bất kỳ chức năng mà thread thực thi chỉ đơn giản có thể gọi hàm pthread_getspecific() và nhận con trỏ đến những gì nó được cho là đang làm.

+1

Vì vậy, hãy xem mã nguồn cho pthread_key_create, nó đặt một biến, được gọi là khóa, bên trong pthread_key_t thành bất kỳ hình thức nào được trả về TlsAlloc. Key là một con trỏ nhưng những gì được trả về từ TlsAlloc? nó chỉ là một mảng các khe trống cho mỗi luồng? Ngoài ra, nếu mỗi luồng có không gian Tls riêng, thì mỗi phần tử trong mảng có trỏ đến không gian Tls của luồng không? Tôi chỉ đang bối rối ở đâu đó và tôi không biết ở đâu. Có lẽ tôi đang làm điều này phức tạp hơn nó cần phải được. – user972276

+2

Về mặt kỹ thuật, pthread_key chỉ là một con trỏ tới một mảng thưa thớt, được tạo ra khi bạn gọi hàm _create. Khi một thread gọi hàm _setspecific() nó điền vào một mục trong mảng với ID của luồng và giá trị được lưu trữ bởi hàm (trong ví dụ của tôi là một con trỏ tới một cấu trúc). Khi một thread gọi _getspecific() nó tìm kiếm mảng bằng khóa, sau đó là mục nhập trong mảng đó theo ID luồng, để tìm giá trị được lưu trữ. –

+1

Hãy nhớ điểm của các giao diện này là để tóm tắt những gì đang diễn ra đằng sau hậu trường để chương trình của bạn không phụ thuộc vào nền tảng/triển khai. –

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