2012-10-08 24 views
9

Điều này có được đảm bảo là threadafe/không tạo ra kết quả không mong muốn?Interlocked.Increment a integer array

Interlocked.Increment(ref _arr[i]); 

trực giác của tôi nói với tôi đây không phải là, ví dụ: đọc giá trị trong _arr [i] là không đảm bảo được 'nguyên tử' với incrementing thực tế.

Nếu tôi đúng khi nghĩ rằng điều này là sai, làm thế nào tôi có thể sửa lỗi này? Cảm ơn.

+0

Ai hoặc cái gì đang đọc giá trị trong '_arr [i]'? Mã này không đọc nó, nó tăng nó nguyên tử bởi vì đó là những gì 'Interlocked.Increment 'không. –

Trả lời

13

Giả sử không có gì thay đổi i hoặc _arr, điều đó sẽ ổn.

Mảng được coi là tập hợp các biến; một gia tăng lồng vào nhau sẽ làm việc tốt bất kể những gì đang xảy ra với một trong hai yếu tố đó hoặc những phần tử khác trong cùng một mảng.

1

Nếu có gì không đồng bộ thay đổi _arr hoặc i sau đó, tôi đồng ý với bạn, không, tra cứu _arr[i] là không nhất thiết phải nguyên tử riêng của mình. Tuy nhiên, như Jon nói, một khi bạn đã xác định được một phần của (một số) _arr, sẽ được tăng lên nguyên tử, độc lập với các hành động khác xảy ra trong các phần tử khác của mảng hoặc để thay đổi thêm _arr hoặc i.

Nếu _arr hoặc i đang được đồng bộ thay đổi, tất cả các tài liệu tham khảo với họ (cả đọc và viết) cần phải được bên trong một lock trên một đối tượng chung. (Và sau đó bạn có thể giảm Interlocked.Increment thành một đơn giản ++.