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