2010-06-12 34 views
6

Tôi đang sử dụng Tiện ích mở rộng song song khá nhiều và tôi vừa mới gặp phải trường hợp sử dụng lưu trữ cục bộ luồng có thể hợp lý để cho phép sử dụng lại đối tượng theo chuỗi công nhân. Như vậy tôi đã xem xét thuộc tính ThreadStatic đánh dấu một trường tĩnh/biến là có một giá trị duy nhất cho mỗi luồng.Sử dụng phần mở rộng song song với thuộc tính ThreadStatic. Nó có thể rò rỉ bộ nhớ?

Dường như với tôi rằng sẽ không khôn ngoan khi sử dụng PE với thuộc tính ThreadStatic mà không có bất kỳ sự đảm bảo nào về việc sử dụng lại luồng bởi PE. Đó là, nếu các chủ đề được tạo ra và bị phá hủy ở một mức độ nào đó thì các biến (và do đó các đối tượng mà chúng trỏ tới) vẫn giữ nguyên lưu trữ cục bộ trong một khoảng thời gian không xác định, gây rò rỉ bộ nhớ? Hoặc có lẽ lưu trữ thread được gắn với các chủ đề và xử lý khi các chủ đề được xử lý? Nhưng sau đó bạn vẫn có khả năng có chủ đề trong một hồ bơi được khao khát sống và tích lũy lưu trữ địa phương thread từ các phần khác nhau của mã các chủ đề được sử dụng cho.

Có cách nào tốt hơn để lấy lưu trữ cục bộ luồng bằng PE không?

Thankyou.

+0

Thuật ngữ chính xác được "nghỉ hưu" thay vì "bị hủy" liên quan đến các chủ đề bị xóa khỏi hồ bơi và sau đó xáo trộn ngăn xếp của chúng. –

Trả lời

5

Tôi thực sự khuyến khích sử dụng mẫu bình thường cho bộ nhớ cục bộ, được mô tả trong số MSDN article này.

Khi bạn sử dụng [ThreadStatic], điều quan trọng là liệu chuỗi chủ đề có làm sạch biến TLS khi kết thúc hay không. Không có bất kỳ gợi ý nào trong tài liệu MSDN mà nó không có. Nó sẽ không khó để thực hiện, nó chỉ phải gọi hàm TlsFree() API. Tôi đã viết một ứng dụng thử nghiệm nhỏ, không có bằng chứng về bất kỳ rò rỉ nào.

4

EDIT: Với câu trả lời của Hans, có vẻ như TLS thực sẽ được làm sạch lên anyway ... mà chỉ để lại chút này của câu trả lời:

Bạn có thực sự không có cách nào tốt hơn về cách sử dụng lại các giá trị trong vòng một chủ đề? Nếu có hai nhiệm vụ sử dụng cùng một luồng (một lệnh hoàn thành, thì luồng còn lại chạy) là chúng thực sự muốn có cùng một giá trị không? Bạn có thực sự là chỉ sử dụng điều này như một cách để tránh truyền bá dữ liệu theo cách được kiểm soát nhiều hơn thông qua tác vụ của bạn không?

+0

Kịch bản này là một mô phỏng của một mạng lưới dựa trên 'thế giới' - độc lập đánh giá một tập hợp các đại lý trong thế giới nói trên. Do đó để chạy song song tôi có thể tạo ra một thế giới mới, sử dụng và loại bỏ trong mỗi vòng lặp song song. Ý định của tôi là đặt phương thức Reset() trên thế giới để cho phép sử dụng lại. Tôi hình dung lượng lưu trữ cục bộ tĩnh khiến tôi không phải quản lý nhóm 'thế giới' của riêng mình với quyền truy cập bị khóa liên quan đến hồ bơi, v.v. – redcalx

+0

@ the-locster: Tôi sợ tôi vẫn không thấy lợi ích của chuỗi lưu trữ cục bộ tại đây. Nếu nó nằm trong một nhiệm vụ, tại sao không chỉ giữ lại tham chiếu? –

+0

Mỗi đánh giá đặt một tác nhân vào một thế giới một mình. Vì vậy, nếu tôi có 8 lõi CPU/chủ đề tôi có 8 thế giới độc lập được mô phỏng tại bất kỳ thời điểm nào - một thế giới cho mỗi chủ đề. – redcalx

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