2012-01-24 30 views
5

Trong khi đọc lên trên luồng POSIX, tôi đã xem một ví dụ về dữ liệu cụ thể theo luồng. Tôi đã có một khu vực hỗn loạn trong tâm trí tôi ...Dữ liệu theo chủ đề cụ thể - tại sao tôi không thể sử dụng bản đồ tĩnh với ID luồng?

Giao diện thread-cụ-dữ liệu trông Hơi phiền phức, đặc biệt là khi bạn kết hợp trong việc sử dụng pthread_once, initializers khác nhau, vv

Is có bất kỳ lý do tôi không thể chỉ sử dụng một std tĩnh :: bản đồ mà chìa khóa là pthread_self() id và giá trị dữ liệu được tổ chức trong phần thứ hai của std :: cặp?

Tôi không thể nghĩ một lý do nào đó sẽ không hoạt động miễn là nó được bao bọc trong một mutex, nhưng tôi không thấy gợi ý nào về nó hay bất cứ điều gì tương tự gây nhầm lẫn cho tôi . Tôi biết luồng có thể có rất nhiều của catch-22 vì vậy tôi nghĩ rằng tôi muốn hỏi và xem nếu tôi sắp bước vào ... một cái gì đó khó chịu? :)

Trả lời

5

Tôi không thể nghĩ ra một lý do rằng điều này sẽ không làm việc miễn là nó được bọc trong một mutex

Điều đó tự nó là một lý do rất tốt; được triển khai đúng cách, bạn có thể truy cập dữ liệu cụ thể theo chủ đề mà không cần ngăn các chủ đề khác tạo đồng thời hoặc truy cập vào các chuỗi của chúng. Ngoài ra còn có hiệu quả chung (truy cập thời gian không đổi, so với thời gian logarit nếu bạn sử dụng std::map), không đảm bảo rằng pthread_t có thứ tự phù hợp được xác định và dọn dẹp tự động cùng với tất cả các tài nguyên luồng khác.

Bạn có thể sử dụng từ khóa thread_local của C++ 11 hoặc boost::thread_specific_ptr nếu bạn không thích API Posix.

+0

+1, cảm ơn bạn cho các từ khóa C++ 11, tôi sẽ tận hưởng bằng cách sử dụng những khi tôi nhận được trên một dự án hỗ trợ nó :) –

3
  1. pthread thread-cụ-dữ liệu tồn tại trước khi container tiêu chuẩn thư viện
  2. thread-cụ-dữ liệu tránh sự cần thiết của khóa và đảm bảo không có messes thread khác với dữ liệu
  3. Dữ liệu được làm sạch tự động lên khi luồng biến mất

Có điều gì ngăn bạn không sử dụng giải pháp của riêng bạn. Nếu bạn có thể chắc chắn rằng các container được xây dựng hoàn toàn trước khi bất kỳ chủ đề đang chạy (mô hình luồng tĩnh), bạn thậm chí không cần mutex.

+0

Hơn nữa, pthread là một api C, không C++ – nos

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