2011-08-25 18 views
12

Tôi đang sử dụng Parallel.Foreach để điền một ConcurrentBag bên ngoài. Tôi cũng đã thử sử dụng một Danh sách chung và mọi thứ đều hoạt động tốt.Khi một ConcurrentBag tốt hơn một Danh sách?

Tôi đã may mắn hoặc tôi đã bỏ lỡ phạm vi đặc biệt của ConcurrentBag?

+0

bao nhiêu lõi/CPU không máy phát triển của bạn có? – ChaosPandion

+0

Hai bộ xử lý. – abx78

Trả lời

18

Bạn đã may mắn; Parallel.ForEach để điền một Danh sách không an toàn cho luồng, cuối cùng bạn sẽ gặp sự cố.

Theo MSDN, List<T> không phải là thread an toàn:

Bất kỳ thành viên dụ không đảm bảo được đề an toàn.

Danh sách <T> có thể hỗ trợ đồng thời nhiều độc giả, miễn là bộ sưu tập không bị sửa đổi. Liệt kê thông qua bộ sưu tập là về bản chất không phải là quy trình an toàn chỉ. Trong trường hợp hiếm hoi khi một điều tra cạnh tranh với một hoặc nhiều lần truy cập viết, cách duy nhất để đảm bảo an toàn luồng là khóa bộ sưu tập trong toàn bộ số đếm . Để cho phép bộ sưu tập được truy cập bằng nhiều chủ đề để đọc và viết, hãy thực hiện đồng bộ của riêng bạn.

ConcurrentBag là những gì bạn nên sử dụng vì điều này, an toàn cho nhiều người đọc và nhà văn.

+0

Cảm ơn bạn đã làm rõ điều này! – abx78

+0

Bạn được chào đón. Vui lòng đánh dấu một trong các câu trả lời được chấp nhận. Cảm ơn! –

5

Nếu bạn đang sử dụng Parallel.ForEach để điền List<T> và mọi thứ hoạt động tốt thì bạn chỉ đơn giản là nhận được may mắn. Phương thức ForEach có thể và sẽ chạy mã của bạn trên nhiều luồng nên bất kỳ liên lạc nào bên ngoài ForEach đều phải có các đối tượng có thể xử lý các bản cập nhật đồng thời. List<T> không thể nhưng ConcurrentBag<T> có thể.

+0

Cả hai câu hỏi đều tốt, cảm ơn bạn! – abx78

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